算法刷题:找到字符串中所有的字母异位词

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

.

题目链接

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

题目详情

题目解析

所谓的异位词,就是一个单词中的字母,打乱顺序,重新排列得到的单词

如:abc->bca

那么题目的目的就很明显了,就是要求在s字符串中找到p的异位词(相同组成,不同排列)

我们来模拟找一下

首先,定义两个指针,维护满足异位词的左右边界

使right往右移动

如图,在left与right之间,长度刚好符合p的异位词,此时,就需要对这个字符串进行校验,很,很明显,cba就属于p的异位词,校验成功,将当前异位词的首元素下标记录一下,然后使right继续往右移,但是此时子串的长度就不满足p的异位词了,因此,需要将left也往右移动一位

移动完成之后,此时子串的长度又满足条件了,进行校验,并不是p的异位词,继续移动,直到遍历完整个数组

很明显,整个过程通过两个指针,同向进行遍历来解决问题,而left与right之间,往右移动的过程,与窗口类似,因此我们考虑使用滑动窗口来实现这个过程

算法原理

滑动窗口流程图

定义指针及变量

定义两个指针:left和right,初始值都为0

创建hash表1,用数组模拟,记录p的每个字母出现的个数

创建hash表2,用数组模拟,用来记录子串(窗口)中各个字母出现的个数

定义变量count,来记录窗口中的有效字母的个数

创建链表来存储满足条件的异位词的下标

进窗口

将right所在的字母添加到hash2中,t添加完成之后

如果hash2[s[right]-'a']<=hash1[s[right]-'a']

说明当前字母是有效字母,就将count加一

判断

判断子串长度是否大于p的异位词的长度

出窗口

当窗口内子串长度大于p的异位词的长度的时候,需要将left所在的字母从hash2中减去1,在减去之前,需要再进行一层判断,判断hash2[s[left]-'a']<=hash1[s[left]-'a'],如果满足,说明减去的是有效字母,因此需要将count进行减一

更新结果

如果有效字母个数count等于p的字母个数,就说明满足p的异位词,将当前子串的下标存进链表中

我的答案

java 复制代码
class Solution {
    public List<Integer> findAnagrams(String ss, String pp) {
        //定义返回值
        List<Integer> list = new ArrayList<>();
        //将ss和pp转换为数组,方便遍历
        char[]s = ss.toCharArray();
        char[]p = pp.toCharArray();
        //创建hash1,统计p
        int[]hash1 = new int[26];
        for(char tmp:p){
            hash1[tmp-'a']++;
        }
        //创建hash2,用于统计s
        int[]hash2 = new int[26];
        //定义变量
        int count = 0;//记录有效字母个数
        for(int left = 0,right = 0;right<s.length;right++){
            //进窗口
            hash2[s[right]-'a']++;
            //维护有效字母个数
            if(hash2[s[right]-'a']<=hash1[s[right]-'a']) count++;
            //判断
            if(right-left+1>p.length){
                //出窗口
                //维护有效字母个数
                if(hash2[s[left]-'a']<=hash1[s[left]-'a']) count--;
                hash2[s[left]-'a']--;
                left++;
            }
            //更新结果
            if(count==p.length){
                list.add(left);
            }
        }
        return list;
    }
}
相关推荐
heimeiyingwang9 天前
【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来
人工智能·深度学习·算法
时空自由民.9 天前
C++ 不同线程之间传值
开发语言·c++·算法
ai小鬼头9 天前
AIStarter开发者熊哥分享|低成本部署AI项目的实战经验
后端·算法·架构
小白菜3336669 天前
DAY 37 早停策略和模型权重的保存
人工智能·深度学习·算法
zeroporn9 天前
以玄幻小说方式打开深度学习词嵌入算法!! 使用Skip-gram来完成 Word2Vec 词嵌入(Embedding)
人工智能·深度学习·算法·自然语言处理·embedding·word2vec·skip-gram
亮亮爱刷题9 天前
飞往大厂梦之算法提升-7
数据结构·算法·leetcode·动态规划
_周游9 天前
【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
数据结构·算法
双叶8369 天前
(C语言)Map数组的实现(数据结构)(链表)(指针)
c语言·数据结构·c++·算法·链表·哈希算法
安全系统学习9 天前
【网络安全】DNS 域原理、危害及防御
算法·安全·web安全·网络安全·哈希算法
Cyrus_柯9 天前
C++(面向对象编程——继承)
开发语言·c++·算法·面向对象