题目描述:
暴力解法:
先分享自己的暴力法思路:
定义两个指针(i,j),j = i + len - 1,其中这个len指的是子串的长度,从最大长度依次-1。每确定一个len,i从0开始向右移,对应的j也确定下来。一旦碰到这样的子串是回文,就直接输出。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
lenth = len(s)
if lenth == 0:
return s
for i in range(lenth,-1,-1):
start = 0
end = start + i
while end <= lenth:
if s[start:end] == s[start:end][::-1]:
return s[start:end]
start += 1
end += 1
这样的算法复杂度是O(N^3),for那个循环、while循环、判断回文,各都需要O(N)的时间。
动态规划:
即填表法。主要思考的就是状态是什么?以及状态如何转移的问题。这两想到用dp这个数组,dp[i][j]=True\False,分别代表s[I…j]子串是\不是回文子串。
状态有了,表也建了,如何转移?
如果s[i] = s[j],那么s[i…j]是否是回文,取决于s[I+1…j-1];如果s[I]!=s[j],那么s[i…j]一定不是回文,这样,状态转移也确定了,即:
if s[i] == s[j]:
dp[i][j] = dp[i+1][j-1]
else:
dp[i][j] = False
这里还有一个问题,就是dp[i+1][j-1]的访问会越界,如果把越界的情况考虑了,那就解出来了。