刷題438. Find All Anagrams in a String

一、題目說明

題目438. Find All Anagrams in a String,給一個字符串s和非空字符串p,在s中找到所有p的相同字母異序詞的start位置。難度是Medium!

二、我的解答

找同源詞,有一個類似的題目49. Group Anagrams,這樣的話,本題目也同樣的思路。每次從字符串s中截取字符串p長度的字符串,判斷是否是同源詞。這裏用排序後相等的比較方法。

class Solution{
	public:
		vector<int> findAnagrams(string s,string p){
			vector<int> res;

			int lenP = p.size();
			int lenS = s.size();
			if(s.empty() || lenS<lenP) return res;
			
			sort(p.begin(),p.end());
			for(int i=0;i<=lenS-lenP;i++){
				string sub = s.substr(i,lenP);
				sort(sub.begin(),sub.end());
				if(sub.compare(p)==0){
					res.push_back(i);
				}
			}
			return res;
		}
};

然而,運行的結果是:Time Limit Exceeded

三、優化措施

經過分析,超時的原因在於,判斷同源詞的方法效率太低。用滑動窗口的思想:每次只要字符串s的子串和p中含有相同的字符和數量即可。

class Solution{
	public:
		vector<int> findAnagrams(string s,string p){
			vector<int> res;

			int lenP = p.size();
			int lenS = s.size();
			if(s.empty() || lenS<lenP) return res;
			
			vector<int> hash(26,0),window(26,0);
			for(int i=0;i<lenP;i++){
				hash[p[i]-'a']++;
				window[s[i]-'a']++;
			}
			if(hash==window) res.push_back(0);
			
			for(int i=lenP;i<lenS;i++){
				window[s[i]-'a']++;
				window[s[i-lenP]-'a']--;
				if(hash==window) res.push_back(i-lenP+1);
			}
			return res;
		}
};

性能如下:

Runtime: 28 ms, faster than 94.51% of C++ online submissions for Find All Anagrams in a String.
Memory Usage: 10.3 MB, less than 98.08% of C++ online submissions for Find All Anagrams in a String.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章