給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
示例 1:
輸入:
"abcabcbb"
輸出:3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入:
"bbbbb"
輸出:1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:
輸入:
"pwwkew"
輸出:3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。
這道題需要借助雜湊查詢key的o(n) 時間複雜度, 否則就會超時
初始化乙個 雜湊表\字典 dic用cur變數從給定字串str的開頭開始 一位一位的向右檢視字元,直到整個字串遍歷完, 對每一位字元進行如下:頭指標start 初始為0
當前指標 cur 初始為0
最大長度變數 l 初始為0
當前位置的字元為 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...