中國建設(shè)銀行網(wǎng)站 黨費云安卓優(yōu)化大師官網(wǎng)
題目: 給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。
異位詞 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 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” 的異位詞。
思路:
首先:使用滑動窗口模板,先確定向右移動移動過程中元素有need中的元素時,進(jìn)行window的++,如果某個字母和need和window中相等時,進(jìn)行vaild++,內(nèi)存while可以更改為if,當(dāng)right-left==t.size()時,在進(jìn)行縮小滑動窗口操作,進(jìn)去后if判斷vaild和need中的元素個數(shù)是否相等,如果相等保存left的所有下標(biāo),再縮小窗口,if再need中有這個字母,并且該字母的個數(shù)和window中的個數(shù)相等,那么vaild–,window也–。
class Test_zArr {
public:vector<int> slidingWindow(string s,string t) {unordered_map<char, int> need,window;vector<int> vee;for (char tt:t) {need[tt]++;}int left = 0,right = 0;int vaild = 0;while (right<s.size()) {char c = s[right];right++;if (need.count(c)) {window[c]++;if (window[c] == need[c]) {vaild++;}}while (right - left == t.size()) {if (vaild == need.size()) {vee.push_back(left);}char d = s[left];left++;if (need.count(d)) {if (window[d] == need[d]) {vaild--;}window[d]--;}}}return vee;}
};int main() {Test_zArr Tz;string s = "cbaebabacd";string t = "abc";vector<int> result = Tz.slidingWindow(s, t);for (vector<int>::iterator it = result.begin(); it != result.end();it++) {cout << *it << " ";}cout << endl;return 0;
}