Question:
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc"
, with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b"
, with the length of 1.
Example 3:
Input: "pwwkew" Output: 3 Explanation: The answer is"wke"
, with the length of 3. Note that the answer must be a substring,"pwke"
is a subsequence and not a substring.
Code:
class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int 滑动窗口方法,把字符存入,然后检查后面的字符是不是在其中,如果在其中就把substring滑动到在发现重复的后面。 并计算substring长度,存入最长长度值。直到循环结束。 """ longest = 0 string_list = list(s) print(string_list) # substring先初始化为空 char_list = [] for i in range(len(s)): # 当前字符 current_char = string_list[i] # 如果当前字符在 substring中 if current_char in char_list: # 则把substring往后移到发现重复字符之后,重复之前包含重复字符的全部丢弃 char_list = char_list[char_list.index(current_char) + 1:len(char_list)] # 并把这次发现的重复的那个字符存入substring(以后可能不会再有重复的) char_list.append(current_char) print(char_list) # 把最长的susstring长度存入longest if len(char_list) > longest: longest = len(char_list) return longest str1 = "abcabcbb" str2 = "bbbbbb" str3 = "pwwkew" s = Solution() print(s.lengthOfLongestSubstring(str1)) print(s.lengthOfLongestSubstring(str2)) print(s.lengthOfLongestSubstring(str3)
Result:
['a', 'b', 'c', 'a', 'b', 'c', 'b', 'b']
['a']
['a', 'b']
['a', 'b', 'c']
['b', 'c', 'a']
['c', 'a', 'b']
['a', 'b', 'c']
['c', 'b']
['b']
3
['b', 'b', 'b', 'b', 'b', 'b']
['b']
['b']
['b']
['b']
['b']
['b']
1
['p', 'w', 'w', 'k', 'e', 'w']
['p']
['p', 'w']
['w']
['w', 'k']
['w', 'k', 'e']
['k', 'e', 'w']
3
这是最优化之后的算法。不用三次循环,也不用一个一个排除。直接把重复的substring前面全部丢到。