春招打卡|无重复最长子串

80 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

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

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

二、思路分析

  1. 新建一个map用于记录字符是否出现过,使用滑动窗口方法遍历,rk代表右指针。
  2. i代表左指针,i每向右移动一格,则删除窗口内一个字符,如果m中没有s[rk+1]的字符,则更新map中rk+1的部分,并且将rk右移。
  3. 最后比较ans 与当前窗口长度,如果ans比当前窗口长度小,则更新当前ans为当前窗口长度。

三、AC 代码

func lengthOfLongestSubstring(s string) int {
    rk := -1
    ans := 0
    m := make(map[byte]int,0)
    for i := 0 ;i < len(s);i++ {
        if i != 0 {
            delete(m,s[i-1])
        }
        for rk + 1 < len(s) && m[s[rk+1]] == 0 {
            m[s[rk+1]]++
            rk++
        }
        if ans < rk - i +1 {
            ans = rk-i+1
        }
    }
    return ans
}

四、总结

滑动窗口是一种常用方法,无重复最长字串,没有遇到重复的情况下一直移动右指针,判断重复则使用map记录字符,每一轮移动左指针会删除一个元素,都会有ans记录最大值为多少,遍历完成后返回ans即可。