字串的排列(滑動視窗)
阿新 • • 發佈:2021-10-25
題目連結:https://leetcode-cn.com/problems/permutation-in-string
題目描述:
給你兩個字串s1和s2 ,寫一個函式來判斷 s2 是否包含 s1的排列。如果是,返回 true ;否則,返回 false 。
換句話說,s1 的排列之一是 s2 的 子串 。
示例 1:
輸入:s1 = "ab" s2 = "eidbaooo"
輸出:true
解釋:s2 包含 s1 的排列之一 ("ba").
示例 2:
輸入:s1= "ab" s2 = "eidboaoo"
輸出:false
提示:
1 <= s1.length, s2.length <= 104
s1 和 s2 僅包含小寫字母
題解:
class Solution { public: bool checkInclusion(string s1, string s2) { int len1 = s1.size(); int len2 = s2.size(); if(len1 > len2) return false; vector<int> win1(26, 0),win2(26, 0); for(int i = 0; i < len1; i++) //構建窗長為len1的視窗 { win1[s1[i] - 'a']++; win2[s2[i] - 'a']++; } if(win1 == win2) return true; for(int i = len1; i < len2; i++) { win2[s2[i] - 'a']++; //視窗右移的同時左縮 win2[s2[i - len1] - 'a']--; if(win1 == win2) return true; } return false; } };