本文实例讲述了Python3最长回文子串算法。分享给大家供大家参考,具体如下:
1. 暴力法
思路:对每一个子串判断是否回文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Solution: def longestPalindrome( self , s): """ :type s: str :rtype: str """ if len (s) = = 1 : return s re = s[ 0 ] for i in range ( 0 , len (s) - 1 ): for j in range (i + 1 , len (s)): sta = i end = j flag = True while sta < end: if s[sta] ! = s[end]: flag = False break sta + = 1 end - = 1 if flag and j - i + 1 > len (re): re = s[i:j + 1 ] return re |
提交结果:超出时间限制
2. 动态规划法
思路:
m[i][j]标记从第i个字符到第j个字符构成的子串是否回文,若回文值为True,否则为False.
初始状态 s[i][i] == True,其余值为False.
当 s[i] == s[j] and m[i+1][j-1] == True 时,m[i][j] = True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Solution: def longestPalindrome( self , s): """ :type s: str :rtype: str """ k = len (s) matrix = [[ False for i in range (k)] for j in range (k)] re = s[ 0 : 1 ] for i in range (k): for j in range (k): if i = = j: matrix[i][j] = True for t in range ( 1 , len (s)): #分别考虑长度为2~len-1的子串(长串依赖短串的二维数组值) for i in range (k): j = i + t if j > = k: break if i + 1 < = j - 1 and matrix[i + 1 ][j - 1 ] = = True and s[i] = = s[j]: matrix[i][j] = True if t + 1 > len (re): re = s[i:j + 1 ] elif i + 1 = = j and j - 1 = = i and s[i] = = s[j]: matrix[i][j] = True if t + 1 > len (re): re = s[i:j + 1 ] return re |
执行用时:8612 ms
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/aawsdasd/article/details/80484938