题目 #
Given a string s, find the length of the longest substring without repeating characters.
思路1 #
- 暴力遍历,每个子字符串都判断是否没有重复字符串
思路2 #
- 两个指针,i和j,j代表右侧,i代表左侧
- j向后遍历,判断i和j之间是否有和j对应字符相同的
- 如果有,计算长度,i移到相同的字符后面
- 使用hashMap进行判断
1func LengthOfLongestSubstring(s string) (result int) {
2 hashMap := make(map[byte]int)
3 for i, v := range s {
4 i1, ok := hashMap[byte(v)]
5 if !ok {
6 hashMap[byte(v)] = i
7 continue
8 }
9 if result < len(hashMap) {
10 result = len(hashMap)
11 }
12 hashMap[byte(v)] = i
13 }
14 if result < len(hashMap) {
15 result = len(hashMap)
16 }
17
18 return
19}
思路3 #
- 在思路2的基础上,将hashMap换成数组,128位
- 由于初始化为0,我们使用
index+1
来作为value
1func LengthOfLongestSubstring(s string) (result int) {
2 var charMap [128]int
3 i := 0
4 for j, v := range s {
5 index := charMap[byte(v)]
6 if index > i {
7 // 0 1 2 3
8 // a b c a
9 // i j
10 length := j - i
11 if result < length {
12 result = length
13 }
14 i = index
15 }
16 charMap[byte(v)] = j + 1
17 }
18 // 0 1 2 3
19 // a b c d
20 // i
21 length := len(s) - i
22 if result < length {
23 result = length
24 }
25
26 return
27}
思路4 #
- 在思路3的基础上,最后一段怎么看都不爽
- 在j移动过程中动态计算长度,不用在遍历完再来判断一遍
1func LengthOfLongestSubstring(s string) (result int) {
2 var charMap [128]int
3 i := 0
4 for j, v := range s {
5 index := charMap[byte(v)]
6 // 0 1 2 3 4
7 // a b c b d
8 // i j
9 // index = 2
10 if i < index {
11 i = index
12 }
13 length := j - i + 1
14 if result < length {
15 result = length
16 }
17 charMap[byte(v)] = j + 1
18 }
19
20 return
21}