代码随想录——找到字符串中所有字母异位词(Leetcode hot9)需要回顾

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

题解:滑动窗口(双指针)

思路:
这段Java代码的思路是使用两个哈希表(HashMap)来寻找字符串s中所有字符串p的异位词的子串,并返回这些子串的起始索引。以下是代码的详细思路:

  1. 初始化
    • 创建一个列表list来存储所有异位词子串的起始索引。
    • 创建两个哈希表hashShashP,分别用于存储字符串s的当前窗口中的字符频率和字符串p的字符频率。
  2. 填充哈希表hashP
    • 遍历字符串p中的每个字符,将字符作为键,字符出现的次数作为值,填充哈希表hashP
  3. 边界检查
    • 如果字符串s的长度小于字符串p的长度,则不可能存在异位词,直接返回空列表。
  4. 滑动窗口
    • 使用两个指针fastslow来表示滑动窗口的右边界和左边界。
    • fast指针小于字符串s的长度时,执行以下步骤:
      • fast指针指向的字符加入到hashS中,并更新字符的频率。
      • 增加fast指针,扩大窗口。
      • 当窗口大小等于字符串p的长度时(即fast - slow == p.length()),执行以下步骤:
        • 比较两个哈希表hashShashP是否相等。如果相等,说明找到了一个异位词,将slow指针的值加入到列表list中。
        • 减少窗口左边界slow指向的字符在hashS中的频率。
        • 如果该字符的频率变为0,则从hashS中移除该键值对。
        • 增加slow指针,缩小窗口。
  5. 返回结果
    • 在滑动窗口的过程中,记录所有满足条件的窗口起始索引,最后返回列表list
      代码通过维护两个哈希表来跟踪当前窗口和字符串p中字符的频率,并通过滑动窗口的方式检查每个窗口是否是字符串p的异位词。当找到异位词时,将窗口的起始索引添加到结果列表中。
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        HashMap<Character,Integer> hashS = new HashMap<>();
        HashMap<Character,Integer> hashP = new HashMap<>();
        for(char str : p.toCharArray()){
            hashP.put(str, hashP.getOrDefault(str, 0) + 1);
        }
        if(s.length() < p.length()){
            return list;
        }
        int fast = 0;
        int slow = 0;
        while(fast < s.length()){
            hashS.put(s.charAt(fast), hashS.getOrDefault(s.charAt(fast), 0) + 1);
            fast++;
            if(fast - slow == p.length()){
                if(hashS.equals(hashP)){
                    list.add(slow);
                }
                hashS.put(s.charAt(slow), hashS.get(s.charAt(slow)) - 1);
                if(hashS.get(s.charAt(slow)) == 0){
                    hashS.remove(s.charAt(slow));
                }
                slow++;
            }
        }
        return list;
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值