1 """
2 Given a string, find the length of the longest substring without repeating characters.
3 Example 1:
4 Input: "abcabcbb"
5 Output: 3
6 Explanation: The answer is "abc", with the length of 3.
7 Example 2:
8 Input: "bbbbb"
9 Output: 1
10 Explanation: The answer is "b", with the length of 1.
11 Example 3:
12 Input: "pwwkew"
13 Output: 3
14 Explanation: The answer is "wke", with the length of 3.
15 Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
16 """
17 """
18 解法一:双指针法,维护了一个滑动窗口
19 便于理解,实用性强
20 """
21 class Solution1:
22 def lengthOfLongestSubstring(self, s):
23 res = 0
24 l, r = 0, 0
25 window = [] #双指针法,维护了一个滑动窗口
26 while l < len(s) and r < len(s):
27 if s[r] not in window:
28 window.append(s[r])
29 r += 1
30 res = max(res, r - l)
31 else:
32 window.pop(0)
33 l += 1
34 return res
35 """
36 解法二:用dict,与leetcode1结合类似
37 难点在于用一个下标不断更新dict中重复字符的值,
38 """
39 class Solution2:
40 def lengthOfLongestSubstring(self, s):
41 d = dict()
42 max_len = 0
43 start = 0 #作为子串左端标记,一直向右
44 for i in range(len(s)):
45 if s[i] in d and d[s[i]] >= start:#!!!!
46 start = d[s[i]] + 1 #!!!用start一直更新重复字符的新值
47 temp = i - start + 1
48 d[s[i]] = i
49 max_len = max(max_len, temp)
50 return max_len
51
52 """
53 解法三:想用暴力法
54 Wrong Answer
55 Input
56 "abcabcbb"
57 Output
58 5
59 Expected
60 3
61 abcbb没符合这种情况
62 """
63 class Solution3:
64 def lengthOfLongestSubstring(self, s: str) -> int:
65 max_len = 0
66 for i in range(len(s)):
67 for j in range(i + 1, len(s)):
68 if s[i] == s[j]: #这逻辑有问题
69 j -= 1
70 break # 很有用,找到第一个相等的跳出循环
71 max_len = max(max_len, j - i + 1)
72 return max_len