簡體   English   中英

字符串中不重復字母的最大 substring

[英]Largest substring of non-repeating letters of a string

從一開始我想指出,我使用的是 Python 語言。 在這個問題中,我最初有一個字符串。 例如'abcagfhtgba'。 我需要找到不重復字母的最大 substring 的長度。 在上面提供的情況下,它是 'agfht' (5),因為在 position [4] 處,'a' 重復,所以我們從頭開始計數。 我對這個問題的想法是創建一個字典,它將字母存儲為鍵,並將它們的外觀數字存儲為值。 每當任何鍵具有對應的值 2 時,我們將字典的長度 append 到名為 result 的列表中,並將其完全替換為空列表。 對於某些測試,這種方法適用,而對於某些測試則不適用。 我將提供我使用的代碼以及簡短的解釋注釋。

在這里,我以列表的形式存儲輸入

this = list(map(str, input()))
def function(list):
    dict = {}
    count = 0
    result = [1]

在這里我開始循環,如果每個元素不在鍵中,我創建一個值為 1 的鍵。如果元素在字典中,我用空的替換字典。 我不會忘記將第一個重復元素存儲在新字典中並執行此操作。 另一個重要的一點是在 append 結束后循環計數。 因為應該考慮字符串的尾部(如果它具有最大的非重復字母序列)。

    for i in range(len(list)):
        if list[i] not in dict:
            dict[list[i]] = 1
            count += 1
        elif list[i] in dict:
            dict = {}
            dict[list[i]] = 1
            result.append(count)
            count = 1
    result.append(count)
    print(result)
    return max(result)

在這里,我讓我的 function 選擇在字符串和它的倒數之間選擇最大的,以處理“adabc”的情況,其中最大的 substring 位於末尾。

if len(this) != 0:
    print(max(function(this), function(this[::-1])))
else:
    print('')

我需要人們的幫助來告訴我解決問題的方法在哪里我錯了並編輯我的代碼。

希望你會發現這更容易一些。 這個想法是跟蹤看到的子串直到set中的給定點,以便更快地查找,如果包含當前值,則重新構建集合,append substring 看到該點。 正如您提到的,您必須檢查是否添加了最后一個值,因此最終的if

s = 'abcagfhtgba'

seen = set()
out = []
current_out = []
for i in s:
    if i not in seen:
        current_out += i
        seen.update(i)
    else:
        seen = set(i)
        out.append(''.join(current_out))
        current_out = [i]
if current_out:
    out.append(''.join(current_out))

max(out, key=len)
# 'agfht'

所以一些關鍵的區別:

  • 迭代字符串本身,而不是范圍
  • 使用集合而不是計數和字典

記住你看到的最后一個副本,維護一個 map 的字母索引。 如果您已經看到,那么這是重復的,因此我們需要重置索引。 但是索引可以是這個新的,也可以是在看到最后一個重復字符之后。

s = 'abcagfhtgba'

seen = dict()
longest = ""
start = 0
last_duplicate = 0
for i, c in enumerate(s):
    if seen.has_key(c):
        if len(longest) < (i - start + 1):
            longest = s[start:i]
        new_start = seen.get(c) + 1
        if last_duplicate > new_start:
            start = i
        else:
            start = new_start
        last_duplicate = i
    seen[c] = I
if len(longest) < (len(s) - start + 1):
   longest = s[start:]
print longest

暫無
暫無

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

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