1. 程式人生 > >[Leetcode] 438. Find All Anagrams in a String 解題報告

[Leetcode] 438. Find All Anagrams in a String 解題報告

題目

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".

思路

一道簡單的題目。下面的程式碼我參考了小榕流光的,他用vector<int>陣列來模擬雜湊表,比較巧妙。比較hash1和hash2是否相等需要O(256)的時間複雜度,可能會導致演算法時間複雜度的常係數比較大。

程式碼

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> hash1(256, 0), hash2(256, 0);
        for(auto ch: p) {
            ++hash1[ch];
        }
        int lenp = p.size(), lens = s.size();
        vector<int> ans;
        for(int i = 0; i < lens; i++) {
            ++hash2[s[i]];
            if(i >= lenp) {
                hash2[s[i-lenp]]--;
            }
            if(hash1 == hash2) {
                ans.push_back(i- lenp + 1);
            }
        }
        return ans;
    }
};