給定一個字符串,請你找出其中不含有重復字符的
最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復字符的最長子串是 "abc",所以其
長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b"
,所以其長度為 1。
示例 3:
輸入: "pwwkew" 輸出: 3 解釋: 因為無重復字符的最長子串是"wke"
,所以其長度為 3。 請注意,你的答案必須是 子串 的長度,"pwke"
是一個子序列,不是子串。
def lengthOfLongestSubstring(s): """ :type s: str :rtype: int """ # 存儲歷史循環中最長的子串長度 max_len = 0 # 判斷傳入的字符串是否為空 if s is None or len(s) == 0: return max_len # 定義一個字典,存儲不重復的字符和字符所在的下標 str_dict = {} # 存儲每次循環中最長的子串長度 one_max = 0 # 記錄最近重復字符所在的位置+1 start = 0 for i in range(len(s)): # 判斷當前字符是否在字典中和當前字符的下標是否大於等於最近重復字符的所在位置 if s[i] in str_dict and str_dict[s[i]] >= start: # 記錄當前字符的值+1 start = str_dict[s[i]] + 1 # print start # 在此次循環中,最大的不重復子串的長度 one_max = i - start + 1 # 把當前位置覆蓋字典中的位置 str_dict[s[i]] = i # 比較此次循環的最大不重復子串長度和歷史循環最大不重復子串長度 max_len = max(max_len, one_max) return max_len print lengthOfLongestSubstring('pwwssffasdf')
這里的解題思路是把字符串中的值當做字典的key,把他對應的索引存為字典的value。通過取出的值跟最開始計數的值進行比較找出最大值。