簡體   English   中英

我如何改善 Python 的時間或內存結果?

[英]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檢查。
  • 為了減少內存,不要收集列表中的所有內容(使用集合或在生成器中生成候選)。
  • 首先只嘗試長度為 2 的所有子字符串,只有當失敗時,才嘗試長度為 3 的子串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM