题目
给定一个字符串,请你找出其中不含有重复字符的【最长子串】的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是【子串】的长度,"pwke" 是一个子序列,不是子串。
思路分析
暴力破解的时间效率太差,不考虑。
设所给字符串的字符长度为 n,则符合要求的子串的首字符在原字符串中的下标的所有可能性为:0,1,……,n-1。依次遍历子串 [k, *),k = 0,1,……,n-1 即可。
解答
func lengthOfLongestSubstring(s string) int {
chars := []rune(s)
n := len(chars)
if n == 0 {
return 0
}
res := 1
for i := 0; i < n; i++ {
// 检查以 i 开头的字串是否唯一
m := map[rune]int{}
m[chars[i]] = i
curr := 1 // 本次循环找到的最大长度
for j := i + 1; j < n; j++ {
if _, in := m[chars[j]]; in {
break
} else {
m[chars[j]] = j
curr++
}
}
if curr > res {
res = curr
}
}
return res
}