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.
解题思路
使用数组字典记录最近一次出现字母的位置;
当遇到某字母时,如果上次记录的位置大于 Left,则证明是第二次出现,需移动 Left 到上次出现该字母的下一位;否则,计算当前未重复字符串的长度,并与 maxLen 比较;
循环时持续更新字典;
func lengthOfLongestSubstring(s string) int {
// 记录字符最近出现位置,数组下标代表字符,值代表位置
location := [256]int{}
// 开始所有字符都没有出现过,标记为 -1
for i := range location {
location[i] = -1
}
maxLen, left := 0, 0
for i := range s {
// 从 left 开始,第二次出现 s[i],即已经出现重复
if location[s[i]] >= left {
// left 推进到第一次出现 s[i] 位置的后一位
left = location[s[i]] + 1
} else if i-left+1 > maxLen {
maxLen = i - left + 1
}
location[s[i]] = i
}
return maxLen
}