本文实例讲述了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