给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
// 解法1
// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
func lengthOfLongestSubstring(s string) int {
var subStrMap = make(map[rune]int)
var minIdx, maxIdx int
var ret = 0
for idx, c := range s {
if i, exist := subStrMap[c]; exist {
minIdx = i + 1
//删除map中idx小于i的记录
for k, v := range subStrMap {
if v < i {
delete(subStrMap, k)
}
}
}
subStrMap[c] = idx
maxIdx = idx
if maxIdx-minIdx+1 > ret {
ret = maxIdx - minIdx + 1
}
}
return ret
}
// 解法2
func lengthOfLongestSubstring2(s string) int {
var subStrMap = make(map[uint8]int)
var ret = 0
for start, end := 0, 0; end < len(s); end++ {
if idx, exist := subStrMap[s[end]]; exist {
if idx >= start {
start = idx + 1
}
}
subStrMap[s[end]] = end
if val := end - start + 1; val > ret {
ret = val
}
}
return ret
}