2025年- G29-Lc103-3. 最长无重复字符的子字符串--java版

发布于:2025-03-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.题目描述

在这里插入图片描述

2.思路

思路1:在字符串 s 中寻找最长的无重复字符子串的长度,它使用了 滑动窗口 和 HashMap 记录字符索引 的方法。

例子1:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
总结:用hashmap记录键值对,键唯一,但是值可以不同。
start来更新索引,也就是遇到重复字符,说明按此顺序的字符有重复。我们应该跳到下一个字母继续执行。
在这里插入图片描述

补充1:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
··············································································
补充2
在这里插入图片描述
在这里插入图片描述
·······························································
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.代码实现

class Solution {

    public int lengthOfLongestSubstring(String s) {

        //1.定义一个哈希表,哈希表可以满足键唯一,值不同.存储字符和字符的索引
        //对应到字符串就是字母一样,但是索引可以不动
        HashMap<Character,Integer> s1=new HashMap<>();
        //2.初始化无重复字符串的最大长度
        int maxLen=0;
        int start=0;
        for(int i=0;i<s.length();i++)
        {
            char letter=s.charAt(i);
            //3.处理遇到重复的字符的子字符串。查找哈希表中现有的键是不是有该字符
            // 如果字符 letter在 HashMap 里,并且索引大于等于 start,就更新 start
            //比如abca,因为start=0,第四个a第二次遇到因为索引是0,等于第一次遇到的a,索引为0,但是此时用大于号,start不更新
            if(s1.containsKey(letter)&&s1.get(letter)>=start)
            {
               start=s1.get(letter)+1;
                //4.更新遇到重复字符的索引
            }
            // 记录当前字符的索引
            s1.put(letter,i);
            //4.计算当前不重复的字符串的长度
            int currLen=i-start+1;
            maxLen=Math.max(currLen,maxLen);
        }
        return maxLen;

    }

    // public static void main(String args[])
    // {
    //     Solution07 test=new Solution07();
    //     String s1="abcdeasdfgh";
    //     int num=test.lengthOfLongestSubstring(s1);
    //     System.out.println("返回无重复字符串的长度"+num);

    // }
}



网站公告

今日签到

点亮在社区的每一天
去签到