给定一个字符串 ,如何查找无重复字符的最长子串

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

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

我的解题思想:
1.用双指针作滑动窗口,初始值都为0,起点相同
2.用右指针遍历字符串
3.先滑动右指针,把右指针的元素和索引添加到哈希表,直到出现重复值。如果不是重复值,则记录窗口长度。
4.匹配到重复值时,要比较左指针的位置。当左指针位于左边时,把左指针滑到原本元素位置的右侧第一个,开启下一个窗口。比如“dvdf”中匹配到d,左指针滑到v。“abba” 中做匹配到重复a时左指针不能动。

我的核心代码:

 int left = 0;
        int right = 0;
        int currentLength = 0;
        int maxLength = 0;
        Map<Character,Integer> map = new HashMap<>();

        // 滑动右指针遍历字符串
        while(right < s.length())
        {
            //获取字符串中指定索引位置的字符
            char c = s.charAt(right);

            //在哈希表里匹配是否已经存在该字符
            if(map.containsKey(c))
            {
                //如果发现重复元素,必须先比较左指针与哈希表里元素的位置关系!!当左指针位于哈希表位置的左侧时,才能滑动左指针,开启新窗口。右指针不动。
                left = Math.max(left,map.get(c) + 1);
            }

            //添加新元素到哈希表,或者更新重复元素的最新位置
            map.put(c,right);

            //判断完不是重复值后,才能计算窗口长度,不然会多算一个长度
            currentLength = right - left + 1;
            maxLength = Math.max(currentLength,maxLength);

            //移动右指针,直到右指针遍历完字符串
            right++;
        }
        return maxLength;
posted @ 2025-07-20 23:41  junjunyi  阅读(11)  评论(0)    收藏  举报