算法之美-【无重复字符的最长子串】滑动窗口

原文链接

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

示例 1:

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

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

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

图片讲解算法核心 滑动窗口,保证每个窗口里字母都是唯一的
在这里插入图片描述

static public int LengthOfLongestSubstring(string s)
{
    
    
    if (string.IsNullOrEmpty(s))
        return 0;

    if (s.Length < 2)
        return s.Length;

    int l = 0;//定义left指针
    int r = 0;//定义right指针
    int maxlen = 0;//定义结果maxlen
    Dictionary<char, int> charSet = new Dictionary<char, int>();//定义哈希表charSet

    while (r < s.Length)
    {
    
    
        if (!charSet.ContainsKey(s[r]))
        {
    
    
            //将字符加到哈希表中, right指针自增
            charSet.Add(s[r++], r);
            maxlen = Math.Max(maxlen, r - l);//计算结果
        }
        else
        {
    
    
            if (r == s.Length - 1)
                return maxlen;

            //删除哈希表中重复的字符, left自增
            charSet.Remove(s[l++]);
        }
    }
    
    return maxlen;
}

猜你喜欢

转载自blog.csdn.net/qq_25670983/article/details/129010583
今日推荐