描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
数据范围:s.length≤40000
示例
// 输入:
"abcabcbb"
// 返回值:
3
// 说明:因为无重复字符的最长子串是"abc",所以其长度为 3。
// 输入:
"bbbbb"
// 返回值:
1
说明:因为无重复字符的最长子串是"b",所以其长度为 1。
// 输入:
"pwwkew"
// 返回值:
3
// 说明:因为无重复字符的最长子串是 "wke",所以其长度为 3。
// 请注意,你的答案必须是子串的长度,"pwke" 是一个子序列,不是子串。
解题思路
滑动窗口
通过 left、right 指针控制左右窗口,长度等于 right - left + 1,右指针依次向右移动
通过 hash(或数组)记录每个字符出现的次数,如果大于 1,则左窗口依次向右移动,直到该字符等于 1 为止
代码实现
/**
* 滑动窗口
*
* @param s string 字符串
* @return int 整型
*/
func lengthOfLongestSubstring(s string) int {
n := len(s)
if n == 1 {
return 1
}
hash := make([]int, 256)
left, right, max := 0, 0, 1
for right < n {
hash[s[right]] += 1
for hash[s[right]] != 1 {
hash[s[left]]--
left++
}
max = int(math.Max(float64(max), float64(right-left+1)))
right++
}
return max
}
还不快抢沙发