(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,通过

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容