1 回答

TA贡献1856条经验 获得超17个赞
Python 中的字符串切片是O(n)(切片n的长度),而 java 的子字符串是O(1)因为它只是在相同的底层char[]. 但是,您可以通过简单地对具有两个移动索引的同一个字符串进行操作来从等式中删除切片。此外,当 first 和 last 不相同时,您可以将索引移过相同字母的块:
@functools.lru_cache(maxsize=None)
def longest_palindromic_subsequence(s, start=None, end=None):
if start is None:
start = 0
if end is None:
end = len(s) - 1
if end < start:
return 0
if end == start:
return 1
if s[start] == s[end]:
return 2 + longest_palindromic_subsequence(s, start+1, end-1)
# you can move indexes until you meet a different letter!
start_ = start
end_ = end
while s[start_] == s[start]:
start_ += 1
while s[end_] == s[end]:
end_ -= 1
return max(
longest_palindromic_subsequence(s, start, end_),
longest_palindromic_subsequence(s, start_, end))
Memoizaton 应该有很大帮助。输入"abcde"。在这return max(...)部分中,最终将对 进行两次递归调用"bcd",甚至对进一步嵌入的子串进行更多调用。
添加回答
举报