LeetCode242有效字母異位詞&&LeetCode438 找到所有字串中的字母異位詞
阿新 • • 發佈:2018-12-20
【242】有效的字母異位詞
給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。
示例 1:
輸入: s = "anagram", t = "nagaram" 輸出: true
示例 2:
輸入: s = "rat", t = "car" 輸出: false
說明: 你可以假設字串只包含小寫字母。
class Solution { public: bool isAnagram(string s, string t) { sort(s.begin(),s.end()); sort(t.begin(),t.end()); if(s==t) return true; else return false; } };
運用這個思路,繼續做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: vector<int> findAnagrams(string s, string p) { sort(p.begin(),p.end()); vector<int> res; for(int i=0;i<s.size();++i){ string tmp(s,i,p.size()); sort(tmp.begin(),tmp.end()); if(tmp == p) { res.push_back(i); } } return res; } };
結果:
超時了!!暴力搜尋看來沒戲了,看了網上大神的解釋,這種求子序列的題目一般都用sliding window進行。可以用兩個變數left和right代表滑動串列埠的左右邊界。於是就有以下解法:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res;
if(s.empty()||s.size()<p.size())
return res;
int left = 0;
int right = p.size() - 1 ;
int a[26]={0};
int b[26]={0};
for(int i=0;i<p.size();i++){
a[(int)s[i]-'a']++;
b[(int)p[i]-'a']++;
}
while(right<s.size()){
int i=0;
for(;i<26;++i){
if(a[i]!=b[i])
break;
}
if(i==26)
res.push_back(left);
if(right+1 == s.size())
return res;
a[(int)s[left]-'a']--;
right++;
left++;
a[(int)s[right]-'a']++;
}
return res;
}
};