用python編寫乙個無重複子串

2021-09-29 17:42:35 字數 2051 閱讀 8401

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入:

"abcabcbb"

輸出:3

解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入:

"bbbbb"

輸出:1

解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入:

"pwwkew"

輸出:3

解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

這道題需要借助雜湊查詢key的o(n) 時間複雜度, 否則就會超時

初始化乙個 雜湊表\字典 dic

頭指標start 初始為0

當前指標 cur 初始為0

最大長度變數 l 初始為0

用cur變數從給定字串str的開頭開始 一位一位的向右檢視字元,直到整個字串遍歷完, 對每一位字元進行如下:

當前位置的字元為 c = str[cur]

查詢當前字元 c 是否 在雜湊表dic的鍵 當中,表示 當前字元c 是否之前遍歷到過

如果 當前字元還沒出現過,就 在dic中記錄乙個鍵值對 (當前字元c,當前位置cur )

cur 後移一位

如果 當前字元出現過, 獲取 當前字串c 上次出現的位置 pre = dic[c]

如果pre 在 start後面即 pre>start, 則把start 移動到 pre的下一位, start = pre + 1,

這樣保證cur繼續向後遍歷中 從start到cur沒有重複元素

否則 start不動,start移動到某乙個位置,說明在這個位置之前有重複的元素了,所以start只往後移動不往回移動

這時候在衡量一下 如果 cur - start + 1 (衡量當前沒重複子串開頭到結尾的長度) 比 長度變數 l 大, 那就替換 l 為

cur - start + 1

'''

'''class

solution

:def

lengthoflongestsubstring

(self, s)

:"""

:type s: str

:rtype: int

"""l =

0 start =

0 dic =

for i in

range

(len

(s))

: cur = s[i]

if cur not

in dic.keys():

dic[cur]

= i else

:if dic[cur]+1

> start:

start = dic[cur]+1

dic[cur]

= i if i - start +

1> l:

l = i - start +

1return l

if __name__ ==

'__main__'

: s = solution(

)# print(s.lengthoflongestsubstring("abcabcbb"))

# print(s.lengthoflongestsubstring("abba"))

print

(s.lengthoflongestsubstring(

"aabaab!bb"))

# print(s.lengthoflongestsubstring("bbbbb"))

kmp演算法 求乙個串的重複子串

題意 在給定的字串前i位找出迴圈節斷的個數。思路 還是kmp演算法的應用變形,從給出字串的第2位開始遍歷,找出每次的匹配的字串 length 前i為字串長度為i,所以i length就是迴圈節斷的個數,要保證i length能夠整除,所以i length 0。移動位數 length 已匹配的字元數 ...

用python編寫乙個小遊戲

1.隨機生成兩個數字 1 1000 在控制台中隨機獲取兩個數字相加 如果使用者輸入正確得10分,否則扣10分。總共5道題,最後輸出得分 import random grade 0for i in range 5 num1 random.randint 1,100 num2 random.randin...

用python編寫乙個計算器

1 2 60 30 40.0 5 9 2 5 3 7 3 99 4 2998 10 568 14 4 3 16 3 2 通過python實現,自動判斷括號以及加減乘除的運算優先順序,得出運算結果,顯示運算步驟 import redef atom cal exp if in exp 計算單個的乘法 a...