《算法闯关指南:优选算法--滑动窗口》--14找到字符串中所有字母异位词

🔥草莓熊Lotso: 个人主页

❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》

生活是默默的坚持,毅力是永久的享受。


🎬 博主简介:


目录

前言:

​编辑

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

解法(滑动窗口+哈希表):

算法思路:

C++代码演示:

Java代码演示:

算法总结&&笔记展示:

结尾


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找"最优解"。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解"局部最优"到"全局最优"的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。


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

题目链接:

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

题目描述:

题目示例:

解法(滑动窗口+哈希表):

算法思路:

  • 因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;
  • 当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词;
  • 因此可以用两个大小为 26 的数组来模拟哈希表,一个来保存 s 中的每个字符出现的个数,另一个来保存 p 中每一个字符出现的个数。这样就能判断两个串是否是异位词

C++代码演示:

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        int hash1[26]={0};//统计字符串p中每个字符出现的次数
        for(auto ch:p) hash1[ch-'a']++;

        int hash2[26]={0};// 统计窗口里面每个字符出现的个数
        int m=p.size();
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            //进窗口+维护count
            if(++hash2[in-'a']<=hash1[in-'a']) count++;
            if(right-left+1>m)//判断
            {
                char out=s[left++];
                //出窗口+维护count
                if(hash2[out-'a']-- <= hash1[out-'a']) count--;
            }
            //更新结果
            if(count==m) ret.push_back(left);
        }
        return ret;
    }
};

Java代码演示:

cpp 复制代码
class Solution {
    public List<Integer> findAnagrams(String ss, String pp) {
        List<Integer> ret = new ArrayList<Integer>();
        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();
        int[] hash1 = new int[26]; // 统计字符串 p 中每⼀个字符出现的个数
        for (char ch : p)
            hash1[ch - 'a']++;
        int[] hash2 = new int[26]; // 统计窗⼝中每⼀个字符出现的个数
        int m = p.length;
        for (int left = 0, right = 0, count = 0; right < s.length; right++) {
            char in = s[right];
            // 进窗⼝ + 维护 count
            if (++hash2[in - 'a'] <= hash1[in - 'a'])
                count++;
            if (right - left + 1 > m) // 判断
            {
                char out = s[left++];
                // 出窗⼝ + 维护 count
                if (hash2[out - 'a']-- <= hash1[out - 'a'])
                    count--;
            }
            // 更新结果
            if (count == m)
                ret.add(left);
        }
        return ret;
    }
}

算法总结&&笔记展示:

笔记字有点丑,大家见谅:


结尾

往期回顾:

《算法闯关指南:优选算法--滑动窗口》--09长度最小的子数串,10无重复字符的最长字串

《算法闯关指南:优选算法--滑动窗口》--11最大连续1的个数 III,12将 x 减到 0 的最小操作数

《算法闯关指南:优选算法--滑动窗口》--13水果成篮

结语:最新力扣438题解析:字符串字母异位词搜索,附手写解题笔记+代码实现,适合算法进阶学习,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

相关推荐
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据实时流处理在金融高频交易数据分析中的应用
java·大数据·量化交易·异常检测·apache flink·实时流处理·金融高频交易
IT成长日记3 小时前
【LVS入门宝典】LVS NAT模式实战指南:ip_forward、iptables与SNAT、DNAT规则配置详解
linux·运维·tcp/ip·负载均衡·lvs·nat
hhhhhshiyishi3 小时前
WLB公司内推|招联金融2026届校招|18薪
java·算法·机器学习·金融·求职招聘
韩立学长3 小时前
【开题答辩实录分享】以《城市网约车服务预约与管理小程序的设计与实现》为例进行答辩实录分享
java·小程序·选题
---学无止境---3 小时前
九、内核数据结构之list
linux·数据结构·list
yics.3 小时前
多线程——单例模式
java·单例模式·多线程·线程安全
奔跑吧邓邓子3 小时前
【C++实战㊳】C++单例模式:从理论到实战的深度剖析
c++·单例模式·实战
error:(3 小时前
【Linux命令从入门到精通系列指南】apt 命令详解:Debian/Ubuntu 系统包管理的现代利器
linux·ubuntu·debian
bing_feilong3 小时前
树莓派4B+ubuntu20.04设置国内源
linux