(11)Go双索引滑动窗口求无重复最长子串

双索引滑动窗口:时间复杂度为O(n)
// 双索引滑动窗口
func lengthOfLongestSubstring2(in string) int {
    n := len(in)
    if n < 2 {
        return n
    }
    
    maxLength := 1
    startI, endI := 0, 0 //[startI...endI]为无重复字符子串
    m := make(map[rune]int)

    // 两种情况:1种m[ch]在startI之后,可以加上长度+1,
    // 1种在startI之前,startI要变成m[ch]+1
    for i, ch := range in {
        // 存储的值索引+1,是为了统一逻辑好写代码,
        // 不然首位元素索引为0,跟map的默认值0相同,得单独区分写代码
        endI = i + 1  
        if m[ch] >= startI {
            startI = m[ch] + 1
        } else {
            // 新出现的字符在startI左边,则无重复子串长度+1,找出其中最长子串长度
            maxLength = max(maxLength, endI-startI+1)
        }
        m[ch] = endI
    }
    return maxLength
}

func max(x int, y int) int {
    if x >= y {
        return x
    }
    return y
}

提交leetcode,通过

你可能感兴趣的:((11)Go双索引滑动窗口求无重复最长子串)