下面是使用自下而上动态编程给出字符串 s
找到最长回文子串的算法 . 因此,该算法探索所有可能的长度 j
substring,并检查它是否是1到n中 j
的有效回文 . 由此产生的时间和空间复杂度为 O(n^2)
.
def longestPalindrome(s):
n = len(s)
if n < 2:
return s
P = [[False for _ in range(n)] for _ in range(n)]
longest = s[0]
# j is the length of palindrome
for j in range(1, n+1):
for i in range(n-j+1):
# if length is less than 3, checking s[i] == s[i+j-1] is sufficient
P[i][i+j-1] = s[i] == s[i+j-1] and (j < 3 or P[i+1][i+j-2])
if P[i][i+j-1] and j > len(longest):
longest = s[i:i+j]
return longest
我试图用自上而下的方法和memoization实现相同的算法 .
Question: 是否可以将此算法转换为自上而下的方法?
关于最长的回文子串有很多问题,但他们大多使用这种自下而上的方法 . https://stackoverflow.com/a/29959104/6217326中的答案似乎与我的想法最接近 . 但答案似乎是使用不同的算法(而且速度要慢得多) .
1 回答
这是递归的我的解决方案:从i = 0开始,j =最大长度if(i,j)是palindrome:然后max substring length是j-1 . 否则使用(i 1,j)和(i,j-1)进行递归,并在这两者之间取Max . 代码将解释更多:
}