题目传送
解题思路:
Length of longest substring
- string :
asdasdfgerzs
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
- step 1
- 以 start , end 两个下标标识子串的起止点,初始化的时候都位于字符串起始位置
start
↓
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
↑
end
- step 2
- 移动 end 下标,往后寻找子串,直到找到重复字符
start
↓
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
↑
end
- 此时子串为 asd,长度为 3,大于初始长度 0 ,储存
- 因为找到重复字符,子串 start 移动到新起点
start
↓
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
↑
end
- 重复 step 1 、step 2 直到循环结束
……
start
↓
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
↑
end
最终情况
start
↓
+-----------------------+
|a|s|d|a|s|d|f|g|e|r|z|s|
+-----------------------+
↑
end
循环结束
输出最长子串长度:8
附源码:
golang 版本
func lengthOfLongestSubstring(s string) int {
val := []byte(s)
kv := make(map[byte]int, 0)
lens := len(s)
var l, cL int
for i, j := 0, 0; i < lens && j < lens; j++ {
if kv[val[j]] > i {
i = kv[val[j]]
}
cL = j - i + 1
if cL > l {
l = cL
}
kv[val[j]] = j + 1
}
return l
}