[英]How can i improve time or memory result in Python?
我正在嘗試學習 Python,所以我遇到了一個問題:對於我的課程有要求:最大時間 1 秒和最大內存 512Mb。 任務是按字母順序找到最小的回文。 回文的最小長度是 2。例如:ghghwwdkjnccjknjn 這里是:ghg、cc、ww、njn。 我們需要最小的 - cc 或 ww - 在字母表中 c 位於 w 之前(就像在字典中一樣)。 aba在aca前面(c>b)等等
這是我的代碼:
s = input("")
lst = []
for i in range(0, len(s)):
for j in range(i + 1, len(s) + 1):
p = s[i:j]
if p == p[::-1] and len(p)>=2:
lst.append(p)
lst.sort()
del p
if not lst:
print("-1")
else:
#lst.sort()
print(sorted(lst, key = len)[0])
通過這種方式,我得到 1.088s 9.89Mb 並且隨着 lst.sort() 移動到最后,我得到 0.901s 527.30Mb - 兩個都很糟糕。 我怎樣才能做得更好? 謝謝!
下面提到的所有改進的有效清潔實施:
def substrings(string, length):
for i in range(len(string) - length + 1):
yield string[i : i+length]
def palindromes(strings):
for string in strings:
if string == string[::-1]:
yield string
def best_palindrome(string):
for length in 2, 3:
if result := min(palindromes(substrings(string, length)), default=None):
return result
return -1
print(best_palindrome(input()))
以 218 毫秒和 796 KB(使用 Python 3.7.2)被 Code Forces 接受。
也許最簡單的修改是將它添加為j
循環中的第一件事:
if j - i > 3:
break
也就是說,不要檢查超過 3 的長度。因為任何更長的回文,如 abba 或 abcba,都包含較短的回文,如在這些情況下的 bb 或 bcb。 因為無論如何你都想要一個最短的,任何更長的總是沒用的。
另外,只在最后排序,而不是在每次追加之后。
通過這兩個更改,我在 Code Force接受了它(鏈接來自您下面的評論)。
進一步可能的改進:
i + 2
而不是i + 1
開始j
並刪除len(p)>=2
檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.