leetcode3无重复字符的最长子串

如有错误,感谢不吝赐教、交流

题目要求:

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

分析:

遍历字符串,每个字符用HashMap记载下来,key为字符,value为字符对应的索引。当遇到重复字符时,计算在这个字符之前的不重复字符串的长度,与最长字符串长度值比较后更新为最大的,然后获取HashMap中对应字符的索引,下一次从这个索引之后为start,具体直接看代码。
具体流程请看图片所示
leetcode3无重复字符的最长子串_第1张图片
leetcode3无重复字符的最长子串_第2张图片
leetcode3无重复字符的最长子串_第3张图片
leetcode3无重复字符的最长子串_第4张图片
leetcode3无重复字符的最长子串_第5张图片
然后看代码吧。

代码实现

if (s.length() == 0 || s.length() == 1) {
            return s.length();
        }
        // 记录每个字符和对应的索引,对于重复字符,更新索引位置
        HashMap<Character, Integer> map = new HashMap<>();
        int max = 1;
        map.put(s.charAt(0), 0);
        int start = 0;
        for (int i = 1; i < s.length(); i++) {
            char c = s.charAt(i);
            Integer index = map.get(c);
            // 在map中已经存过
            if (index != null) {
                // 需要开始切换了,获取切换前的最大长度
                // i-1索引对应到start都是没重复的
                max = Math.max(max, i - start);
                // 开始索引切换到重复元素对应的下一个位置
                start = Math.max((int) index + 1, start);
                map.put(c, i); // 更新重复元素的索引
            } else {
                // 没有重复,直接走,将字符存到map中
                map.put(c, i);
            }
        }
        // 再次更新
        max = Math.max(max, s.length() - start);
        return max;

ps:计划每日更新一篇博客,今日2023-04-20,日更第四天,昨日更新,KMP字符串匹配算法

你可能感兴趣的:(#,leetcode,算法,leetcode)