【滑动窗口+计数】LCR015找到字符串中所有字母异位词

求解代码

java 复制代码
public List<Integer> findAnagrams(String s, String p) {
        List<Integer> ans = new ArrayList<>();

        if (s.length() < p.length()) {
            return ans;
        }

        int[] arrP = new int[26]; // 统计p的字符出现次数
        int[] arrS = new int[26]; // 统计s滑动窗口内的字符出现次数

        for (int i = 0; i < p.length(); i++) {
            arrP[p.charAt(i) - 'a']++; // p的第i个字符对应数组下标,计数+1
            arrS[s.charAt(i) - 'a']++; // 先统计s前p.length()个字符的计数
        }

        // 用于比较两个数组的内容是否完全相等
        if (Arrays.equals(arrP, arrS)) {
            ans.add(0);
        }

        // 初始窗口是[0, p.length()-1],右边界从p.length()开始
        int left = 0;
        int right = p.length();

        while (right < s.length()) {
            // 右边界字符加入窗口:计数+1
            arrS[s.charAt(right) - 'a']++;
            // 左边界字符移出窗口:计数-1
            arrS[s.charAt(left) - 'a']--;

            // 窗口右移:左、右边界各+1
            left++;
            right++; 
                       
            // 此时窗口起始下标是left,判断是否匹配
            if (Arrays.equals(arrP, arrS)) {
                ans.add(left);
            }


        }

        return ans;
    }

小贴士

这道题思路和 【滑动窗口+字符计数数组】LCR_014_字符串的排列 基本一致,只不过有一些细节上的东西需要注意。

比如字符串排列那道题的处理顺序是:

更新计数 ➡️ 判断 ➡️ 移动边界

而这道题是:

更新计数 ➡️ 移动边界 ➡️ 判断

相关推荐
夜天炫安全4 小时前
数据结构中所需的C语言基础
c语言·数据结构·算法
2301_789015625 小时前
DS进阶:AVL树
开发语言·数据结构·c++·算法
zyq99101_18 小时前
优化二分查找:前缀和降复杂度
数据结构·python·蓝桥杯
qyzm8 小时前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
逆境不可逃9 小时前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
CoderCodingNo9 小时前
【GESP】C++五级练习题 luogu-P1182 数列分段 Section II
开发语言·c++·算法
放下华子我只抽RuiKe59 小时前
机器学习全景指南-直觉篇——基于距离的 K-近邻 (KNN) 算法
人工智能·gpt·算法·机器学习·语言模型·chatgpt·ai编程
kisshuan123969 小时前
[特殊字符]【深度学习】DA3METRIC-LARGE单目深度估计算法详解
人工智能·深度学习·算法
sali-tec9 小时前
C# 基于OpenCv的视觉工作流-章33-Blod分析
图像处理·人工智能·opencv·算法·计算机视觉
Eward-an10 小时前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode