今天在刷了几道简单的动态规划后,又看了看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. Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法

    本文为转载内容,感谢原作者.原文出自:http://zhaoxiaoru39.blog.163.com/blog/static/609552192012511104730115/ 我遇到的问题是:在n ...

  2. 初始seajs

    SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制 SeaJS本身遵循KISS(Keep It Simple, Stupid ...

  3. 安装4.x版本的express开发框架

    错误版本(未更新前的安装方法,更新后就不是这么安装了,好多网上的教程还是这种方法,所以这里先写明了,旧版这里是可以通过的,但是新版4.x就不行了,请用分割线下边的方法)   本文演示在Linux上安装 ...

  4. Composer的使用

    安装 curl -sS https://getcomposer.org/installer | php 你可以使用--install-dir选项将Composer安装到指定的目录,例如: curl - ...

  5. MVC4商城项目一:框架设计

    代码已托管在  https://code.csdn.net/denghao156/ktnmb_mvc4 先上图,设计模式参考:ddmvc4.codeplex.com 一.unintofwork  设计 ...

  6. Vue.js实现拼图游戏

    Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...

  7. win7 安装 redis +php扩展

    1:首先下载redis:redis-2.0.2.zip (32 bit),解压. 从下面地址下:http://code.google.com/p/servicestack/wiki/RedisWind ...

  8. Counting square

    Problem Description There is a matrix of size R rows by C columns. Each element in the matrix is eit ...

  9. 打包静态库.a文件的方法(ar,ranlib,nm命令介绍)

    一 常用脚本 1 打包脚本 脚本如下,下面附上ar 和 ranlib命令参考(命令来自于网络) ALLLIB=*.aFILE=`ls *.a`#原来的库解压重命名 for F in $FILEdo   ...

  10. Lining Up(在一条直线上的最大点数目,暴力)

    Lining Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...