給定兩個字符串 s1 和 s2埂淮,寫一個函數(shù)來判斷 s2 是否包含 s1 的排列。
換句話說捎泻,第一個字符串的排列之一是第二個字符串的子串俊抵。
示例:
輸入: s1 = "ab" s2 = "eidbaooo"
輸出: True
解釋: s2 包含 s1 的排列之一 ("ba").
// 采用滑動窗口策略
// 由于字符串的長度可能是10000,所以求出全部組合n!是不現(xiàn)實的钠导,
// 可以將問題轉(zhuǎn)化為求指定區(qū)域內(nèi)字符的數(shù)量震嫉,即s1="aab",則{a:2,b:1},
// 所以只需要用一個窗口代表該區(qū)域牡属,在s2上滑動票堵,如果有滿足上述特征的則
// 是一個滿足條件的值。
bool checkInclusion(string s1, string s2) {
int n1 = s1.size(), n2 = s2.size();
if(n1 > n2)
return false;
// 窗口的大小設(shè)定為字符串集
vector<int> v1(128), v2(128);
for(int i = 0; i < n1; i++) {
// 字符對應(yīng)的ASCII碼可以作為數(shù)組下標(biāo)
++v1[s1[i]], ++v2[s2[i]];
}
if(v1 == v2) return true;
// v2即為滑動窗口,不斷移動然后和原有窗口作比較
for(int i = n1; i < n2; i++) {
++v2[s2[i]];
--v2[s2[i-n1]];
if(v1 == v2)
return true;
}
return false;
}