无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
- 子串,需要保证的是连续性,为了保证连续性,因此在本题中使用滑动窗口来维持“一段连续的子串”。在本题,“不包含重复字符的”,则考虑到使用map。因此,本题使用滑动窗口+map的方法。
- 滑动窗口:相当于是一个队列,当队列最右边元素(right指针指向的元素)的map=1,说明,最左边的元素(left指针指向的元素)和最右边的元素(right)是相同的,则移动left指针,直到两边的元素不同。
- 使用一个常量维持最长字串长度。
解法
func lengthOfLongestSubstring(s string) int {
left,right:=0,0
maxValue:=0
hashMap:=map[byte]int{}
for right<len(s){
_,ok:=hashMap[s[right]]
if !ok{
hashMap[s[right]]++ // left和right指向不同的元素,则right右移
right++
}else{
delete(hashMap,s[left]) // 如果left和right均指向相同的元素,则删除left指向的元素
left++ // left右移
}
maxValue=max(maxValue,right-left) // 保存最长的无重复子串长度
}
return maxValue
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
总结
- “无重复”可考虑map。
- “最长无重复子串”可考虑滑动窗口。