3 无重复字符的最长子串

题目:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解题思路

  • 滑动窗口,详见解法1。具体是初始化一个数组 list,保存遍历过的元素;以及 left,right 两个指针,移动 right 并将元素加入 list;前置判断,如果 list 不为空,且包含当前元素,则移除最早加入的元素,Left 指针递增;左右指针的差就是不含重复字符的子串,求其最大长度即可。

// date 2022/09/29
func lengthOfLongestSubstring(s string) int {
    left, right := 0, 0
    ans, n := 0, len(s)
    list := make([]uint8, 0, 64)  // 需要判断是否重复,list存在窗口的元素
    // 构造窗口
    for right < n {
        // 当窗口不在满足条件,即当前元素s[right]已经出现重复
        // 增加left指针,使窗口缩写
        for len(list) != 0 && isContains(s[right], list) {
            list = list[1:]
            left++
        }
        // 增加right
        list = append(list, s[right])
        right++
        if right - left > ans {
            ans = right - left
        }
    }
    return ans
}

func isContains(c uint8, list []uint8) bool {
    for _, v := range list {
        if v == c {
            return true
        }
    }
    return false
}

最后更新于