LeetCode每日一題 - 567. 字串的排列
阿新 • • 發佈:2021-02-11
題目:567. 字串的排列
Description
給定兩個字串 s1 和 s2,寫一個函式來判斷 s2 是否包含 s1 的排列。
換句話說,第一個字串的排列之一是第二個字串的子串。
Sample
輸入: s1 = “ab” s2 = “eidbaooo”
輸出: True
解釋: s2 包含 s1 的排列之一 (“ba”).
Solution
滑動視窗,滑滑滑~
- 統計s1各字元出現的次數
- 一個視窗,兩個指標,初始時,L= 0,R = 0
- 如果s2的當前字元沒有在s1出現,將L指標移到當前位置的下一個位置(直接忽略並清空視窗)。如果在s1出現並且視窗中出現的次數小於s1中出現的次數,直接放入視窗。如果在s1出現但視窗中出現的次數已等於s1中出現的次數,不斷將L指標指向的字元從視窗彈出,並後移L指標,直至當前字元可以放入視窗
- 如果視窗中的字元長度等於s1的長度,返回true
AC Code
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int m[26]={0};
for(char i : s1) m[i-'a']+=1;
int l=0,r=0;
int len1 = s1.length();
int len2 = s2.length();
while(r<len2){
if(m[s2[r]-'a' ]<1){
while(l<r && m[s2[r]-'a']<1){
m[s2[l]-'a']++;
l++;
}
if(l==r && m[s2[r]-'a']<1){
l++;
}
}
if(m[s2[r]-'a']>=1) m[s2[ r]-'a']--;
if(r-l+1==len1){
return 1;
}
r++;
}
return 0;
}
};
第一次100%,嘻嘻嘻~
希望對你有幫助!