0.声明

该题目来源于LeetCode
如有侵权,立马删除。
解法不唯一,如有新解法可一同讨论。

1.题目

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

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

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

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

提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

2.代码

namespace LeetCode_0003无重复字符的最长子串
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "abcabcbb";
            LeetCode_LengthLongSub llls = new LeetCode_LengthLongSub();
            int i_Max = llls.LengthOfLongestSubstring(s);

            Console.WriteLine("i_Max:" + i_Max);
            Console.ReadKey();
        }
    }

    class LeetCode_LengthLongSub
    {
        public int LengthOfLongestSubstring(string s)
        {
            HashSet<char> hashSet = new HashSet<char>();//哈希集合,记录每个字符是否出现过
            int i_Left = 0, i_Right = 0;//定义初始左右指针位置
            int i_Length = s.Length;//定义长度
            int i_Count = 0;//定义每次指针移动后的当前hashSet长度
            int i_Max = 0;//定义最大数值

            while (i_Right < i_Length)//若右指针 < 字符串长度
            {
                if (!hashSet.Contains(s[i_Right]))//若当前元素不包含在哈希集合中
                {
                    hashSet.Add(s[i_Right]);//将该字符添加进集合
                    i_Right++;//继续右移指针
                }

                else//若重复,则删除左指针
                {
                    hashSet.Remove(s[i_Left]);
                    i_Left++;//将左指针右移
                }

                i_Count = hashSet.Count;//获取当前运算结果后的长度
                i_Max = Math.Max(i_Max, i_Count);//取最大值
            }

            return i_Max;
        }
    }
}

06-10 00:35