[Leetcode] 438. Find All Anagrams in a String 解題報告
阿新 • • 發佈:2019-01-22
題目:
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; } };