标题:3无重复字符的最长子串-中等
题目
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: s = "pwwkew"
输出: 3
提示
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
代码Go
package main
import "fmt"
func main() {
s := "a"
ans := lengthOfLongestSubstring(s)
fmt.Printf("ans: %v\n", ans)
}
// 暴力题解-时间超限
func lengthOfLongestSubstring1(s string) int {
n := len(s)
if n == 1 {
return 1
}
for i := n; i > 0; i-- {
for j := 0; j <= n-i; j++ {
if is(s[j : j+i]) {
return i
}
}
}
return 0
}
// 滑动窗口
func lengthOfLongestSubstring2(s string) int {
n := len(s)
if n < 1 {
return 0
}
left, right := 0, 1
ans := 0
for right <= n {
if is(s[left:right]) { // is() 太用时
if ans < right-left {
ans = right - left
}
right++
} else {
left++
}
}
return ans
}
// 判断是否有重复元素
func is(str string) bool {
var strMap map[byte]int = make(map[byte]int, len(str))
for i := 0; i < len(str); i++ {
if strMap[str[i]] == 0 {
strMap[str[i]] = 1
} else {
return false
}
}
return true
}
func lengthOfLongestSubstring(s string) int {
n := len(s)
if n < 1 {
return 0
}
ans := 0
left, right := 0, 0
var strMap map[byte]int = make(map[byte]int, len(s))
for right < n {
fmt.Printf("s[left:right]: %v\n", s[left:right])
if strMap[s[right]] == 0 {
strMap[s[right]] = 1
if right-left+1 > ans {
ans = right - left + 1
}
right++
} else {
strMap[s[left]] = 0
left++
}
}
return ans
}