1. 程式人生 > 其它 >LeetCode每日一題 - 567. 字串的排列

LeetCode每日一題 - 567. 字串的排列

技術標籤:LeetCodeleetcode滑動視窗雙指標

題目:567. 字串的排列

Description

給定兩個字串 s1 和 s2,寫一個函式來判斷 s2 是否包含 s1 的排列。
換句話說,第一個字串的排列之一是第二個字串的子串。

Sample

輸入: s1 = “ab” s2 = “eidbaooo”
輸出: True
解釋: s2 包含 s1 的排列之一 (“ba”).

Solution

滑動視窗,滑滑滑~

  1. 統計s1各字元出現的次數
  2. 一個視窗,兩個指標,初始時,L= 0,R = 0
  3. 如果s2的當前字元沒有在s1出現,將L指標移到當前位置的下一個位置(直接忽略並清空視窗)。如果在s1出現並且視窗中出現的次數小於s1中出現的次數,直接放入視窗。如果在s1出現但視窗中出現的次數已等於s1中出現的次數,不斷將L指標指向的字元從視窗彈出,並後移L指標,直至當前字元可以放入視窗
  4. 如果視窗中的字元長度等於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%,嘻嘻嘻~
在這裡插入圖片描述
希望對你有幫助!