每日算法之LeetCode 483:Find All Anagrams in a String

LeetCode 483:Find All Anagrams in a String(找到字符串中所有字母异位词)

Q:Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

翻译君:给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。

这题和我之前说的LeetCode 3很类似,很容易想到用滑动窗口来解决。

这里就直接贴代码,不做具体的分析了。当你理解了滑动窗口再来看代码还是很简单的。

 vector<int> findAnagrams(string s, string p) {

        int smap[256]={0};
        int pmap[256]={0};
        vector<int> res;

        if(s.size()<p.size()) return res;

        int l=0,r=0;            //窗口的范围
        int plen=p.size();
        int count=0;            //统计p中的字符在s的窗口中出现的次数

      for(int i=0;i<p.size();i++)
        pmap[p[i]]++;



        while(r<s.size()){

            smap[s[r]]++;
            if(smap[s[r]]<=pmap[s[r]])
                count++;

            if(r-l+1==plen){
                if(count==plen) res.push_back(l);   //s的窗口和p一样长并且p中的字符全部在s的窗口中出现,将第首元素下标

                smap[s[l]]--;                               //因为窗口需要右移所以需要先将左指针指向的字符去掉

                if (smap[s[l]] < pmap[s[l]])
                count--;                                    //如果左指针指向的字符在p里面还需要将count--

                l++;
            }

            r++;
        }

        return res;

    }

我的这个解法其实并不完全符合题意,题意将字符串内容限制在26个小写英文字母,但是我的解法将字符串内容扩大到256个ASCII码里的所有字符了。好处很明显,是解决的范围更广了。但是相对来说,效率就变得略低了。

    原文作者:树獭非懒
    原文地址: https://www.jianshu.com/p/a6bb8a9d123a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞