前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >14.【滑动窗口】---找到字符串中所有字母异位词

14.【滑动窗口】---找到字符串中所有字母异位词

作者头像
用户11288958
发布2025-01-20 17:56:10
发布2025-01-20 17:56:10
6700
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

题目传送门

方法一:滑动窗口

算法原理

新建两个哈希表(数组模拟) :通过比较两个哈希表是否一样用来判断是否是异位词 hashS用来统计字符串s的字符出现次数, hashP用来统计字符串p的字符出现次数, 通过滑动窗口 每当right - left + 1 > 字符串p的长度的时候。此时令 left++并让left-‘a’指向的字符出现次数-- 来保证这个窗口大小是 <= 字符串p的长度 每当窗口大小等于字符串p的长度,就比较两个hash数组是否一样。若一样,就添加left下标 到ret顺序表中

代码语言:javascript
代码运行次数:0
复制
class Solution {
    public List<Integer> findAnagrams(String s0, String p0) {
        int[] hashS = new int[26]; //通过比较两个哈希表是否一样用来判断是否是异位词
        int[] hashP = new int[26];
        char[] s = s0.toCharArray();//字符串转数组,方便求解
        char[] p = p0.toCharArray();
        int m = s0.length(),n = p0.length(); //得到两字符串长度
        List<Integer> ret = new ArrayList<>();

        for (int i = 0; i < n; i++) {   //将p字符串扔进拟哈希表p。等待与拟哈希表s进行比较
            hashP[p[i] - 'a']++;
        }
        for (int left = 0,right = 0; right < m; right++) {
            hashS[s[right] - 'a']++;    //进窗口
            if(right - left + 1 > n){   //如果进多了,那么就出窗口。
                hashS[s[left++]-'a']--;
            }
            if (Arrays.equals(hashS, hashP)){ //此时窗口大小一定为p数组长度的大小。
                ret.add(left); //比较两哈希表是否一致,如果一致,就添加初始索引。
            }
        }
        return ret; //最终返回初始索引数组集
    }
}

后面自己写出来的

代码语言:javascript
代码运行次数:0
复制
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int[] hashS = new int[26];
        int[] hashP = new int[26];
        List<Integer> ret = new ArrayList<>();
        int m = s.length(),n = p.length();

        for(int i = 0; i < n; i++){
            hashP[p.charAt(i)-'a']++;
        }

        for(int left = 0,right = 0; right < m; right++){
            hashS[s.charAt(right) - 'a']++;
            if(right - left + 1 > n){
                hashS[s.charAt(left++) - 'a']--;
            }
            if(Arrays.equals(hashS,hashP)){
                ret.add(left);
            }
        }
        return ret;
    }
}

再小小优化一下

代码语言:javascript
代码运行次数:0
复制
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int[] hashS = new int[26];
        int[] hashP = new int[26];
        List<Integer> ret = new ArrayList<>();
        int m = s.length(),n = p.length();

        for(int i = 0; i < n; i++){
            hashP[p.charAt(i)-'a']++;
        }

        for(int left = 0,right = 0; right < m; right++){
            hashS[s.charAt(right) - 'a']++;
            if(right - left + 1 > n){
                hashS[s.charAt(left++) - 'a']--;
            }if(right - left + 1 == n && Arrays.equals(hashS,hashP)){
                ret.add(left);
            }
        }
        return ret;
    }
}

复杂度分析:

时间复杂度:O(m+n) m和n分别是字符串s和p的长度 空间复杂度:O(m) m是字符串s的长度

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目传送门
  • 方法一:滑动窗口
  • 算法原理
  • 复杂度分析:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档