代码随想录——无重复字串的最长子串(Leetcode hot8)

题目链接
在这里插入图片描述

滑动窗口(双指针)

思路:

  1. 初始化:
  • 检查字符串的长度。如果长度为0或1,则直接返回长度,因为这样的字符串本身就是无重复的。
  • 初始化两个指针 slow 和 fast,分别代表当前最长无重复子字符串的起始位置和当前遍历的位置。
  • 创建一个 HashMap,用于存储字符及其最后一次出现的索引
  1. 遍历字符串:
  • 使用 fast 指针遍历字符串 s。
  • 对于每个字符,检查 HashMap 是否包含该字符。
    • 如果包含,说明找到了一个重复字符。将 slow 指针移动到重复字符的下一个位置,然后更新 HashMap 中的索引
    • 如果不包含,直接将字符及其索引添加到 HashMap 中。
  1. 更新最长子字符串长度:
    在每次 fast 指针移动后,计算当前无重复子字符串的长度(即 fast - slow + 1),并与当前记录的最长子字符串长度 res 进行比较,取较大值作为新的最长子字符串长度。
  2. 返回结果:
    当 fast 指针遍历完整个字符串时,返回记录的最长子字符串长度 res。
class Solution {
    
    
    public int lengthOfLongestSubstring(String s) {
    
    
        if(s.length() == 0 || s.length() == 1){
    
    
            return s.length();
        }

        int slow = 0;
        int fast = 0;
        int res = 0;
        HashMap<Character, Integer> hashMap = new HashMap<>();
        while(fast < s.length()){
    
    
            if(hashMap.containsKey(s.charAt(fast))){
    
    
                // slow指针移动到重复字符的下一个位置
                slow = Math.max(slow, hashMap.get(s.charAt(fast)) + 1);
            }
            hashMap.put(s.charAt(fast), fast);
            res = Math.max(res, fast - slow + 1);
            fast++;
        }
        return res;
    }
} 

尝试向哈希表中添加一个键值对,其中键与哈希表中已有的键相同,HashMap
不会修改现有键的值,而是会创建一个新的键值对,这将导致哈希表中存在多个具有相同键的项。
所以本题slow的更新需要取slow = Math.max(slow, hashMap.get(s.charAt(fast)) + 1);

猜你喜欢

转载自blog.csdn.net/qq_46574748/article/details/141205378