LeetCode 438 Find All Anagrams in a String

来源:互联网 发布:atsl有obd端口吗 编辑:程序博客网 时间:2024/06/05 19:09

题目:

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.

Example 1:

Input:s: "cbaebabacd" p: "abc"Output:[0, 6]Explanation:The substring with start index = 0 is "cba", which is an anagram of "abc".The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

Input:s: "abab" p: "ab"Output:[0, 1, 2]Explanation:The substring with start index = 0 is "ab", which is an anagram of "ab".The substring with start index = 1 is "ba", which is an anagram of "ab".The substring with start index = 2 is "ab", which is an anagram of "ab".
题目链接

题意:

给一个字符串s(未知是否为空),和一个模版字符串p(不为空),要求找到以模版字符串p的字母排列组合后形成的字符串在s中的序的集合(vector)。

我们可以统计模版字符串中各个字母出现的次数,放在数组model中,之后从0开始遍历s,将从i到i+p.length()-1的字母出现次数存放在数组v中,每次维护数组v,并比较v和model是否相同,相同则将当前i加入到ans中即可。

代码如下:

class Solution {public:    bool judge(int a[], int b[]) {        for (char c = 'a'; c <= 'z'; c ++) {            if (a[c] != b[c]) {                return false;            }        }        for (char c = 'A'; c <= 'Z'; c ++) {            if (a[c] != b[c]) {                return false;            }        }        return true;    }    vector<int> findAnagrams(string s, string p) {        if (s.length() < p.length())             return {};        int model[200] = {0}, v[200] = {0}, len = p.length();                for (int i = 0; i < len; i ++) {            model[p[i]] ++;            v[s[i]] ++;        }        vector<int> ans;        if (judge(model, v)) {            ans.push_back(0);        }        for (int i = 1; i+len-1 < s.length(); i ++) {            v[s[i+len-1]] ++;            v[s[i-1]] --;            if (judge(model, v)) {                ans.push_back(i);            }        }        return ans;    }};


原创粉丝点击