【LeetCode热题100】--48.找到字符串中所有字母异位词

48.找到字符串中所有字母异位词

使用滑动窗口:

由于字符串p的异位词的长度一定与字符串p的长度相同,所以我们可以在字符串s中构造一个长度为字符串p的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串p中每种字母的数量相同,则说明当前窗口为字符串p的异位词

在算法实现中,我们可以使用数组来存储字符串p和滑动窗口中每种字母的数量

当字符串s的长度小于字符串p的长度时,字符串s中一定不存在字符串p的异位词,但是因为字符串s中无法构造长度与字符串p的长度相同的窗口,所以这种情况需要单独处理

代码:

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo {
    public static List<Integer> findAnagrams(String s, String p) {

        int sLen = s.length(), pLen = p.length();

        if (sLen < pLen) {
            return new ArrayList<Integer>();
        }

        List<Integer> ans = new ArrayList<Integer>();
        int[] sCount = new int[26];
        int[] pCount = new int[26];
        for (int i = 0; i < pLen; ++i) {
            sCount[s.charAt(i) - 'a']++;
            pCount[p.charAt(i) - 'a']++;
        }


        if (Arrays.equals(sCount, pCount)) {
            ans.add(0);
        }

        for (int i = 0; i < sLen - pLen; ++i) {
            --sCount[s.charAt(i) - 'a'];
            ++sCount[s.charAt(i + pLen) - 'a'];

            if (Arrays.equals(sCount, pCount)) {
                ans.add(i + 1);
            }
        }

        return ans;
    }
    public static void main(String[] args) {
        String s = "cbaebabacd";
        String p = "abc";
        List<Integer> ans = new ArrayList<Integer>();
        ans = findAnagrams(s,p);
        System.out.println(ans);

    }
}

在IDEA中调试进一步理解这个算法:

相关推荐
蒋星熠1 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油1 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream2 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL2 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
空白到白2 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
索迪迈科技2 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
zzzsde3 小时前
【数据结构】队列
数据结构·算法
芒克芒克3 小时前
LeetCode 面试经典 150 题:删除有序数组中的重复项(双指针思想解法详解)
算法
青 .3 小时前
数据结构---二叉搜索树的实现
c语言·网络·数据结构·算法·链表
MChine慕青4 小时前
顺序表与单链表:核心原理与实战应用
linux·c语言·开发语言·数据结构·c++·算法·链表