1. 程式人生 > 實用技巧 >438. 找到字串中所有字母異位詞

438. 找到字串中所有字母異位詞

438. 找到字串中所有字母異位詞

給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。 字串只包含小寫英文字母,並且字串 s 和 p 的長度都不超過 20100。 說明:
字母異位詞指字母相同,但排列不同的字串。
不考慮答案輸出的順序。
示例 1: 輸入:
s: "cbaebabacd" p: "abc" 輸出:
[0, 6] 解釋:
起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。
起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。
示例 2: 輸入:
s: "abab" p: "ab" 輸出:
[0, 1, 2] 解釋:
起始索引等於 0 的子串是 "ab", 它是 "ab" 的字母異位詞。
起始索引等於 1 的子串是 "ba", 它是 "ab" 的字母異位詞。
起始索引等於 2 的子串是 "ab", 它是 "ab" 的字母異位詞。 程式碼:
class Solution {
public:
    bool check(int hash_s[], int hash_p[])
    {
        int i;
        for(i = 0; i<26; i++)
        {
            if(hash_p[i]>hash_s[i])
                
return 0; } return 1; } vector<int> findAnagrams(string s, string p) { int hash_p[26] = {0}, hash_s[26] = {0}; int left=0, right=0; vector<int> result={}; if(s.size()<p.size()) return result; for(const auto &c : p) { hash_p[c
-'a']++; } int len = p.size(); for(right=0; right<len-1; right++) { hash_s[s[right]-'a']++; } while(right<s.size()) { hash_s[s[right]-'a']++; if(check(hash_s, hash_p)) { result.push_back(left); } hash_s[s[left]-'a']--; left++; right++; } return result; } };