LeetCodeHor100——438.找到字符串中所有的字母异位词

题目链接放在这里了438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

这道题的要求就是我们在一个字符串中找到另一个字符串的字母异位词,字母异位词就类似于abc,bca,cab这种关系,这道题的具体思路如下:

首先进行边界处理,对于空字符串和null值做处理(虽然你的代码中未显式写出,但这是滑动窗口题的常规操作)。接着,我们定义一个长度为26的数组map来存储目标字符串p中各个字符的频次,同时定义一个变量total记录目标字符串的长度,以及一个变量count用来记录当前窗口中已经匹配上的有效字符个数。

然后我们就可以逐个字符遍历字符串s了。每到一个新的字符,我们首先判断该字符在map中的频次是否大于0,如果大于0,说明这个字符是我们需要的,于是将count加1。紧接着,无论该字符是否是我们需要的,都要在map中将其对应的频次减1,以表示将当前字符纳入窗口并消耗掉一个名额。

接下来判断当前窗口是否还在初始阶段(即索引i小于total),如果是,只需判断count是否等于total,相等则说明找到了异位词,将起始下标加入结果集即可。

如果窗口已经滑动,我们需要把滑出窗口左侧的字符(即cs[i-total])对应的频次在map中加1。此时要特别注意一个小细节:在恢复频次之前,如果该字符在map中的值等于-1,说明它之前是被多消耗掉的,现在加1后刚好变为0,意味着我们"还回"了一个有效字符,此时必须将count减1。最后,再次判断count是否等于total,如果相等,说明当前窗口内的字符种类和数量与目标字符串完全一致,将当前窗口的起始下标加入结果集,遍历结束后返回即可。

这道题在掌握了滑动窗口和数组计数的思想之后做起来还是没什么困难的,但是有个小细节需要注意下,就是count的维护一定要和map的频次变化严格同步。我们在处理的时候,只有当字符从"缺少"(>0)变为"匹配"(<=0)时才增加count,只有当字符从"多余"(<0)变为"匹配"(>=0)时才减少count,具体代码实现如下:

java 复制代码
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        int[] map = new int[26];
        for(char c:p.toCharArray()){
            map[c-'a']++;
        }
        char[] cs = s.toCharArray();
        int total = p.length();
        int count = 0;
        for(int i = 0;i<cs.length;i++){
            if(map[cs[i]-'a']>0){
                count++;
            }
            map[cs[i]-'a']--;
            if(i<total){
                if(count==total){
                    res.add(i-total+1);
                }
                continue;
            }
            map[cs[i-total]-'a']++;
            if(map[cs[i-total]-'a']>0){
                count--;
            }
            if(count==total){
                res.add(i-total+1);
            }
        }
        return res;
    }
}
相关推荐
维克兜率天2 分钟前
【维克】统计套利:寻找市场的“定价误差“
人工智能·python·算法
aqiu11111113 分钟前
【C++算法打怪专栏】LeetCode 1. 两数之和(哈希表解法总结)
c++·算法·leetcode
楚识科技22 分钟前
票据 OCR 识别技术深度解析:从算法原理到企业级落地实现
算法·ocr
longlongzihan24 分钟前
LeetCode 25. K 个一组翻转链表 (迭代+分组反转法)
算法·leetcode·链表
xuxigifxfh24 分钟前
牛客:BISHI8 大整数哈希
java·算法·哈希算法
涉密IT资质笔记27 分钟前
涉密资质投入产出分析模型:时间成本、四块成本构成与 ROI 决策框架
java·开发语言·算法
木井巳29 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
北风toto40 分钟前
KMP 算法详解:从暴力匹配到 O(n+m) 的字符串搜索
java·开发语言·算法
林澈在路上1 小时前
哪个写歌软件可以用自己声音?MELO音乐详解
人工智能·python·算法
爱读书的小胖1 小时前
Codewars Sum of a Sequence Hard Core Version C 解题分析
c语言·数据结构·算法