今天在刷了几道简单的动态规划后,又看了看string方面的题

第五题 Longest Palindromic Substring

题目的意思:求一个字符串的最长回文子串

分析:开始,我的想法是,现在字符串中插入特殊字符,比如'$',这样可以规避回

文串长度为奇数或偶数的讨论问题,加入特殊字符后,长度始终为奇数。然后建立一个数组,该数组记录了以每一位为中心的回文字符串的长度。解法很简单:

def findmin(s):
s_ = '~' + '~'.join(s) + '~'
st = ''
p = [0 for i in range(len(s_))]
for i in range(len(s_)):
if i == 0 or i == len(s_)-1:
p[i] = 1
else:
temp = 0
for j in range(min(i, len(s_)-i-1)+1):
if s_[i-j] != s_[i+j]:
break
temp += 1
p[i] = temp
position = p.index(max(p))
for i in range(max(p)):
if s_[position+i] != '~':
st += s_[position+i]
if (max(p)-1) % 2 == 0:
st = st[::-1] + st
else:
st = st[:0:-1] + st
return st

可是提交上去后,结果是运行超时...(时间复杂度比较高,没通过) 然后我百度了一下这个问题,找到了一个比较nb的算法,复杂度为O(n)

Manacher算法: 一开始和我的想法类似,填充特殊字符,保证回文串长度为奇数。Manacher算法用一个辅助数组p[i]表示以字符T[i]为中心的最长回文字串的最右字符到T[i]的长度,比如以T[i]为中心的最长回文字串是T[l,r],那么p[i]=r-i+1。p[i]-1就是该回文子串在原字符串S中的长度。

Len数组的计算 首先从左往右依次计算p[i],当计算p[i]时,pj已经计算完毕。设P为之前计算中最长回文子串的右端点的最大值,并且设取得这个最大值的位置为id

总结一下,Manacher算法通过记录已匹配的最右位置和对应的对称中心来跳过一些没用的比较

class Solution:
@param {string} s
@return {string}
def longestPalindrome(self, s):
s ='$'+'$'.join(s)+'$'
mx = 0 #之前计算的最长的回文子串长度所能到达的最后边界
id_ = 0 #mx对应的中心
p = [0 for i in range(len(s))]
st = ''
for i in range(len(s)):
#i在边界内
if mx > i:
p[i] = min(p[2*id_-i], mx-i)
#i在边界外,需要从头开始匹配
else:
p[i] = 1
while i-p[i] >= 0 and i+p[i] < len(s) and s[i-p[i]] == s[i+p[i]]:
p[i] += 1
#如果新计算的回文串右端点位置大于mx,需要更新mx与id_
if mx < p[i] +i:
mx = p[i] +i
id_ = i
#输出字符串
position = p.index(max(p))
for i in range(max(p)):
if s[position+i] != '$':
st += s[position+i]
if (max(p)-1) % 2 == 0:
st = st[::-1] + st
else:
st =st[:0:-1] + st
return st

leetcode算法刷题(三)的更多相关文章

  1. leetcode 算法刷题(一)

    今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...

  2. leetcode算法刷题(五)——动态规划(三)

    今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...

  3. leetcode算法刷题(四)——动态规划(二)

    又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...

  4. leetcode算法刷题(二)——动态规划(一)

    上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...

  5. Leetcode算法刷题:217和219题 Contains Duplicate

    从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...

  6. Leetcode算法刷题:第100题 Same Tree

    Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...

  7. Leetcode算法刷题:第14题 Longest Common Prefix

    Longest Common Prefix 题目 给予一个列表,元素为字符串,写一个程序找出最长公共前缀 解题思路 先比较两个字符串,如果第一个字符不一样,则返回空值,比较完成后,用这个公共字符串和下 ...

  8. Leetcode算法刷题:第112题 Path Sum

    Path Sum 题目 给予一个二叉树,和一个值su,寻找是否有一个从根节点到叶节点的和为su,有则返回True,没有为False.比如: 5 / \ 4 8 / / \ 11 13 4 / \ \ ...

  9. leetcode top-100-liked-questions刷题总结

    一.起因 宅在家中,不知该做点什么.没有很好的想法,自己一直想提升技能,语言基础自不必言,数据结构还算熟悉,算法能力一般.于是乎,就去刷一通题. 刷题平台有很多,我选择了在leetcode进行刷题.回 ...

随机推荐

  1. JavaWeb中filter的详解及应用案例

    一:Filter介绍 Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletRespons ...

  2. go JSON

    package utils import ( "encoding/json" "errors" ) func JsonToMap(text []byte) (m ...

  3. LogBoy运行截图

  4. nodejs学习随机记录

    1. nodejs的顶层对象:global(nodejs中没有window) 2. nodejs一个文件就是一个模块 每个模块都有自己的作用域 通过var声明的变量,只属于当前模块下,并非全局的 va ...

  5. svg 文字

    <text>标签 在svg中用使用<text>标签去定义一段文字.如 Example 1 在svg中写下 在平坦的路上曲折前行 Example 1 Dome <svg h ...

  6. wxwidgets demo

    环境说明: IOS: mac 10.9 wx:  wxWidgets-2.9.5  (http://www.wxwidgets.org/downloads/) gcc: $gcci686-apple- ...

  7. 简便数据库——ORMLite框架

    一.创建DataBase //使用 Singleton 避免產生多個實例(instance),要注意 thread safe 這邊使用雙重鎖定(Double-checked locking) 使用 T ...

  8. eclipse tomcat内存设置

    -Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m

  9. bokeh-scala

    使用bokeh-scala进行数据可视化 目录 前言 bokeh简介及胡扯 bokeh-scala基本代码 我的封装 总结 一.前言 最近在使用spark集群以及geotrellis框架(相关文章见h ...

  10. What does cmd /C mean? [closed] 关于nodejs的子进程部分

    之前一直很不明白为什么 child_process.spawn(command[, args][, options]) shell <Boolean> | <String> I ...