美文网首页Go算法
(11)Go双索引滑动窗口求无重复最长子串

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

作者: 哥斯拉啊啊啊哦 | 来源:发表于2019-05-14 12:18 被阅读0次
    双索引滑动窗口:时间复杂度为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双索引滑动窗口求无重复最长子串

        本文链接:https://www.haomeiwen.com/subject/bdxsaqtx.html