博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Longest Palindromic Substring
阅读量:5094 次
发布时间:2019-06-13

本文共 2203 字,大约阅读时间需要 7 分钟。

题目:

算法分析

这道题的解法有三种:暴力法、动态规划、Manacher算法。三种方法的时间复杂度分别为O(n3),O(n2),O(n)。暴力法过于简单粗暴,Manacher算法又有点不好理解,所以,这里只介绍动态规划法。对于O(n2)的时间复杂度,也是可以接受的吧。如果,你想追求5G的极速享受,请转接。

既然要利用动态规划,首要任务就是要找到状态转移方程。乍看此题,哪里来的状态转移。所以,我们需要构建状态。
这里,我们要定义一个二维数组Matrix[len(str)][len(str)],用来存储状态。对于为什么这么定义,我只能说记住就行了,以后类似的题目都是可以套用的。
下面,解释一下状态的含义。Matrix[i][j]表示的是字符串str从第i位置到第j位置是否为回文子串,如果是,则存储True,如果不是,则存储False。
这样状态转移方程就可以写出来了:
Matrix[i][j]={
True,False,     Matrix[i+1][j1] and str[i]=str[j]     else
最后,需要注意一些特殊状态的赋值:
Matrix[i][i]=True
Matrix[i][i+1]=True when str[i]=str[i+1]
这样,状态转移方程就建立完成了。我们只需要把这个矩阵填充完,就可以找到最大的回文子串了。
怎么找最大回文子串?你可以在程序开头定义两个变量,分别记录最大回文子串的长度和开始位置,这样在每次更新Matrix矩阵的过程中,比较当前找到的最大回文子串的长度与变量里记录的最大长度,然后决定是否更新,如果更新,就把最大回文子串的开始位置也更新一下。这样,当整个矩阵填充完,相应的最大回文子串也就找到了。

代码实现

动态规划:

class Solution(object):    def longestPalindrome(self, s1):        """        :type s: str        :rtype: str        """        length = len(s1)        max = 0        start = 0        matrix = [[True if i == j else False for i in range(length)] for j in range(length)]        for i in range(length-1):            if s1[i] == s1[i+1]:                matrix[i][i+1] = True                max = 1                start = i        for step in range(2, length):            for i in range(length-step):                if s1[i] == s1[i+step] and matrix[i+1][i+step-1]:                    matrix[i][i+step] = True                    if max < step:                        max = step                        start = i        return s1[start:start+max+1]

Manacher算法:

class Solution(object):    def longestPalindrome(self, s):          t = '$#' + '#'.join(s) + '#_'          return t        p = [0] * 4010          mx, id, mmax, right = 0, 0, 0, 0          for i in range(1, len(t) - 1):              if mx > i:                  p[i] = min(p[2 * id - i], mx - i)              else:                  p[i] = 1              while t[i + p[i]] == t[i - p[i]]:                  p[i] += 1              if i + p[i] > mx:                  mx = i + p[i]                  id = i              if mmax < p[i]:                  mmax = p[i]                  right = i          return s[right//2 - mmax//2: right//2 - mmax//2 + mmax - 1]

转载于:https://www.cnblogs.com/ritchiewang/p/5767385.html

你可能感兴趣的文章
构造函数的继承
查看>>
Nginx的虚拟主机配置
查看>>
overflow 属性
查看>>
Mychael原创题 洛谷T23923 Mychaelの水题 【题解】
查看>>
Objective-C 协议(protocol)
查看>>
Android自定义进度条
查看>>
java虚拟机深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
查看>>
struts返回对象json格式数据
查看>>
[[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
查看>>
Scrapy爬取小说简单逻辑
查看>>
《移动平台应用开发实践》教学进程(12周)
查看>>
OracleDG主库丢失归档增量同步
查看>>
32位的PLSQL登录64位的ORA11g有关问题
查看>>
spring+mybatis通用dao层、service层的实现
查看>>
CentOS和Ubuntu哪个好?
查看>>
python三大神器之virtualenv
查看>>
CityMaker SDK与三维GIS城市
查看>>
java中的Timer
查看>>
python基础_格式化输出(%用法和format用法)
查看>>
算法初步——二分
查看>>