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

原题链接

思路

这题整体比较简单。最容易想到的就是直接暴力算法,时间复杂度为O(N²)。

随后观察后发现,其实可以使用滑动窗口的方式,每次只添加或者只删除一个字母的计数,那么再加上统计所有字母数字的数组,得到的时间复杂度约为O(26N)。

但是注意到题目中似乎并没有限制p的长度一定小于等于s的长度。在数据中似乎也并没有给出反例。或许是要作为一种特殊情况处理。

最开始的时候还把这个s和p的长度搞反了,导致出现一些错误。

代码

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int n1=s.size();
        int n2=p.size();
        vector<int>ans;
        vector<int>cnt1(26,0);
        vector<int>cnt2(26,0);

        if (n1 < n2) return ans;
        for(int i=0;i<n2;i++){
            cnt2[p[i]-'a']++;
        }
        int l=0;
        for(int i=0;i<n1;i++){
            cnt1[s[i]-'a']++;
            if(i-l+1==n2){
                if(cnt1==cnt2){
                    ans.push_back(l);
                }
                cnt1[s[l]-'a']--;
                l++;
            }
        }
        return ans;
    }
};

总结

这题是一个典型的通过滑动窗口就可以解决的问题。但是在具体代码过程中,需要注意s和p的长度,以及窗口具体的移动方式。整体上比较简单,很很快就可以写出来。

相关推荐
老师我太想进步了202622 分钟前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志7832437 分钟前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU11440 分钟前
P1481 魔族密码
c++·算法·动态规划
文丑颜不良啊2 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊2 小时前
LeetCode2001~2020题目解析
java·leetcode
加宝的起点雷达4 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David4 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
文丑颜不良啊5 小时前
LeetCode2021~2040题目解析
java·leetcode