题意:找到字符串中所有可以重排列得到目标串的字串位置。
思路:记录目标串中各字母出现的次数,枚举字符串中每一个字母。
class Solution {
public:
Solution() {
vector<int> inich(26, 0);
ch = inich;
}
vector<int> ch;
string os;
int plength;
vector<int> findAnagrams(string s, string p) {
for(int i = 0; i < p.length(); ++ i) {
ch[p[i] - 'a'] ++;
}
os = s;
plength = p.length();
vector<int> re;
if(s.length() == 0 || s.length() < p.length()) return re;
for(int i = 0; i < s.length() - p.length() + 1; ++ i) {
if(isAn(i)) re.push_back(i);
}
return re;
}
bool isAn(int b) {
vector<int> tempch = this->ch;
for(int i = b; i < b + this->plength; ++ i) {
if(tempch[os[i] - 'a'] != 0) {
tempch[os[i] - 'a'] --;
}
else {
return false;
}
}
return true;
}
};
还有一个很巧妙的思路是,维持当前仍然需要的匹配的字符个数,如果需要匹配的字符个数为0,则表示已经达到匹配了。
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<bool> isInP(26, false);
vector<int> ch(26, 0);
for(int i = 0; i < p.length(); ++ i) {
isInP[p[i] - 'a'] = true;
ch[p[i] - 'a'] ++;
}
int l = 0;
int r = 0;
int toMatch = p.length();
vector<int> re;
while(r < s.length()) {
if(isInP[s[r] - 'a'] ) {
if(ch[s[r] - 'a'] > 0) toMatch --;
ch[s[r] - 'a'] --;
}//cout << ch[0] << ch[1] << ch[2] << endl;
r ++; //cout << toMatch << endl;
if(toMatch == 0) re.push_back(l);
if(r - l == p.length()) {
if(isInP[s[l] - 'a']) {
if(ch[s[l] - 'a'] >= 0) toMatch ++;
ch[s[l] - 'a'] ++;
}
l ++;
}
}
//cout << ch['e' - 'a'] << endl;
return re;
}
};