Leetcode3. 无重复字符的最长子串

103 阅读1分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

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

二、思路分析

  • 首先分析题意,重点在于子串,也就是连续的
    • 第一步,遍历字符串,并创建Map用来存储遍历过字符
    • 第二部,创建两个指针(快慢指针),快指针每次移动一位,并将当前字符与Map中对比,如果存在则移动慢指针`到存在的下一位。
    • 大概思路就是这样愉快的撸码吧!

三、AC 代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
    //获取字符串长度,定义快慢指针,以及返回值
        int n = s.length(), fast = 0, slow = 0, max = 0;
        //获取字符串数组
        char[] letters = s.toCharArray();
        //创建Map用于存储遍历过的字符串
        Map<Character, Integer> lastOccurrence = new HashMap<>();
        //循环遍历
        for( ; fast < n; fast++){
            char curr = letters[fast];
            //判断当前字符串是否存在
            if(lastOccurrence.containsKey(curr)){
                //存在则将下标加一
                slow = Math.max(slow, lastOccurrence.get(curr) + 1);
            }
            //不管在不在都存
            lastOccurrence.put(curr, fast);
            //获取最长字符串
            max = Math.max(max, fast - slow + 1);
        }
        return max;
    }
}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 这道题的重点在于快慢指针的运用,以及对于Map的使用
    • 细节,要注意最后返回的值要加一

最后这个算法是Leetcode的第三题,也是热题100的第三题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点一下关注,如果你也在刷热题100的话。