算法—leetcode—3—无重复字符的最长子串

189 阅读1分钟

题目

  1. 无重复字符的最长子串

题目描述

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

示例

示例一

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

示例二

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

示例三

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

思路

1、使用一个窗口记录浏览过的元素
2、初始化两个指针left,right;使用right先扫描元素
3、碰到重复的元素调整left,去掉窗口中之前记录的元素
4、初始时初始化一个子串长度,随着left和right更新时,逐步更新

代码

package leetcode

// lengthOfLongestSubstring
// 3. 无重复字符的最长子串
func lengthOfLongestSubstring(s string) int {
    window := map[byte]int{}
    // 左右指针
    left, right := 0, 0
    // 保存结果
    length := 0
    for right < len(s) {
        // 更新窗口
        cur := s[right]
        right++
        window[cur]++
        
        for window[cur] > 1{
            delCur := s[left]
            left++
            window[delCur]--
        }
        length = max(length, right-left)
    }
    return length 
}

func max(a, b int) int{
    if a > b {
        return a
    }
    return b
}

同类——双指针

算法—leetcode—438—找到字符串中所有字母异位词
算法—leetcode—567—字符串的排列
算法—leetcode—76—最小覆盖子串

参考

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/lo…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

labuladong的算法小抄