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

第五题 Longest Palindromic Substring

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

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

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

  1. def findmin(s):
  2. s_ = '~' + '~'.join(s) + '~'
  3. st = ''
  4. p = [0 for i in range(len(s_))]
  5. for i in range(len(s_)):
  6. if i == 0 or i == len(s_)-1:
  7. p[i] = 1
  8. else:
  9. temp = 0
  10. for j in range(min(i, len(s_)-i-1)+1):
  11. if s_[i-j] != s_[i+j]:
  12. break
  13. temp += 1
  14. p[i] = temp
  15. position = p.index(max(p))
  16. for i in range(max(p)):
  17. if s_[position+i] != '~':
  18. st += s_[position+i]
  19. if (max(p)-1) % 2 == 0:
  20. st = st[::-1] + st
  21. else:
  22. st = st[:0:-1] + st
  23. 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算法通过记录已匹配的最右位置和对应的对称中心来跳过一些没用的比较

  1. class Solution:
  2. @param {string} s
  3. @return {string}
  4. def longestPalindrome(self, s):
  5. s ='$'+'$'.join(s)+'$'
  6. mx = 0 #之前计算的最长的回文子串长度所能到达的最后边界
  7. id_ = 0 #mx对应的中心
  8. p = [0 for i in range(len(s))]
  9. st = ''
  10. for i in range(len(s)):
  11. #i在边界内
  12. if mx > i:
  13. p[i] = min(p[2*id_-i], mx-i)
  14. #i在边界外,需要从头开始匹配
  15. else:
  16. p[i] = 1
  17. while i-p[i] >= 0 and i+p[i] < len(s) and s[i-p[i]] == s[i+p[i]]:
  18. p[i] += 1
  19. #如果新计算的回文串右端点位置大于mx,需要更新mx与id_
  20. if mx < p[i] +i:
  21. mx = p[i] +i
  22. id_ = i
  23. #输出字符串
  24. position = p.index(max(p))
  25. for i in range(max(p)):
  26. if s[position+i] != '$':
  27. st += s[position+i]
  28. if (max(p)-1) % 2 == 0:
  29. st = st[::-1] + st
  30. else:
  31. st =st[:0:-1] + st
  32. 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. 理解中WebAPI的属性和相关操作 FormBody和 FormUri等(WebAPI 二)

    1.FromUri使用 将数据通过url方式传递.我们需要在webapi方法标明,这个参数只接受url中参数的值, $("#Save").click(function () { $ ...

  2. JAVA混型和潜在类型机制

    一.混型 ①.定义 二.利用JAVA如何实现混型 ①.代理   ②.装饰器模式  ③.动态代理模式   ④.装饰器模式与代理模式的区别 三.潜在类型机制 ①.定义 四.JAVA的潜在类型机制的补偿 ① ...

  3. MYSQL auto_increment 、default 关键字

    1. auto_increment: innoDB 中 表中只可以有一个列是auto_increment的,这个列还一定要是索引. create table T(X int auto_incremen ...

  4. 带有OUTPUT的INSERT,DELETE,UPDATE

    原文地址:http://blog.sina.com.cn/s/blog_71460d950100nld2.html OUTPUT是SQL SERVER2005的新特性.可以从数据修改语句中返回输出.可 ...

  5. 数据结构--队列之C数组实现

    队列是一种限定操作的线性表,它只能在表的一段插入,另外一段取出.所以也称为先进先出数据结构(FIFO---First In First Out) C代码如下: #include<stdio.h& ...

  6. 高性能浏览器网络(High Performance Browser Networking) 第二章

    第2章 TCP篇 互联网的核心是两个协议,IP和TCP. IP也叫Internet协议,提供主机到主机的路由和寻址:TCP,传输控制协议,在不可靠的传输通道上提供一个可靠的网络抽象.TCP / IP协 ...

  7. Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

    写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号. 一.类与结构体 两者在Swift中差不了多少了 类 ...

  8. Swift主题色顶级解决方案

    一.常规主题色使用点 应用在发布前都会对主题色进行设置,以统一应用的风格(可能有多套主题).在主题色设置上有几个方面,如下: 1. TabBar部分,设置图片高亮.文本高度颜色2. Navigatio ...

  9. XML是什么,它能够做什么?——写给XML入门者

    XML就可以扩展标记语言(eXtensible Markup Language).标记是指计算机所能理解的信息符号,通过此种标记,计算机之间能够处理包括各种信息的文章等.怎样定义这些标记,既能够选择国 ...

  10. 微信内移动前端开发抓包调试工具fiddler使用教程

    在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth.微信浏览器内打开,照样能看你源码~ 使用fiddler来抓包 需要先做一些简单的准备工作: ...