【发布时间】:2018-09-09 21:47:45
【问题描述】:
这是 Python 代码:
def is_palindrome(s):
return s == s[::-1]
def longestp(s):
if is_palindrome(s):
return s
maxp = s[0]
for i in range(len(s)-1):
half_length = len(maxp) // 2
start = i - half_length
end = i + half_length
while start >= 0 and end <= len(s)-1:
if is_palindrome(s[start:end+2]):
if len(s[start:end+2]) > len(maxp):
maxp = s[start:end+2]
end += 1
elif is_palindrome(s[start:end+1]):
if len(s[start:end+1]) > len(maxp):
maxp = s[start:end+1]
start -= 1
end += 1
else:
break
return maxp
我最初认为它是O(n^3),因为有两个嵌套循环和字符串切片,但在我的测试中它几乎是线性的。是否有任何类型的输入会使该算法变慢?
【问题讨论】:
-
“它在我的测试中几乎是线性的”:切片增加了复杂性,但它不像 python 循环那么慢。你是如何测量“线性”边的?
-
除此之外:我确信可以完成比
len(s[start:end+1])更快的事情。切片字符串只是为了计算长度只是次优的。我认为你最好用开始和结束参数重写is_palindrome,并且在你的所有程序中都不要切片。这可能会更快(并且不太复杂:)) -
how did you measure the "linear" side?- 使用 100、1k、10k 字符的输入字符串(随机和回文)运行%timeit。 -
@EugeneYarmash “字符串”是什么?您如何确保 10k 字符串包含不同长度的回文子字符串?
-
你可能用回文来计时,这符合
if is_palindrome(s):的情况。
标签: python string python-3.x substring palindrome