567 字串的排列(滑動視窗)

2021-10-19 08:37:54 字數 1305 閱讀 7434

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

示例1:

輸入: s1 = 「ab」 s2 = 「eidbaooo」

輸出: true

解釋: s2 包含 s1 的排列之一 (「ba」).

示例2:

輸入: s1= 「ab」 s2 = 「eidboaoo」

輸出: false

由於題**現了子串,所以可以利用滑動視窗(雙指標)來解決問題。但由於是判斷 s2 是否包含 s1 的排列,所以要用固定的滑動視窗(長度與 s1 的長度相同,即 left 指標和 right 指標所包含的區間要與 s1 的長度始終保持一致),在 s2 中進行比較判斷。

由題易知,s1 中每個元素出現的次數要與當前 s2 上的滑動視窗中的每個元素出現的次數要相同且元素值也要相同。

(1) 定義兩個陣列(長度為 26)分別放入 s1 和 s2 中每個元素的ascii 碼值 - 『a』 的 ascii 碼值 = 當前元素在字母表中的位置(例:『a』 在陣列中存的是 0;'c』在陣列中存的是 2;依次類推…)

(2) 設定兩個 newnums 陣列並初始化為0,用來記錄當前固定的滑動視窗中每個元素的出現次數和 s1 中每個元素的出現次數。記錄完後,進行比較看兩個 newnums 陣列是否相等

若 newnums[i] == 0,則 i 是第一次出現。

class

solution

int[

] loca =

newint

[m];

int[

] locb =

newint

[n];

for(

int i=

0;i)for

(int i=

0;i)while

(right < n)

//只要找到了,就直接true並退出迴圈

if(arrays.

equals

(newnums1, newnums2)

)for

(int i=

0;i)//固定滑動視窗整體右移

left++

; right++;}

return flag;

}}

明天就大年三十啦,祝大家新年快樂哦!!!

567 字串的排列(滑動視窗)

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。還是套用模板就可以了。注意兩點 收縮視窗的時機 本題一旦發現視窗內有滿足的排列,就立即返回 class solution int left 0 int right 0 in...

567 字串的排列

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 思路 注釋 public boolean checkinclus...

567 字串的排列

題意理解 查詢乙個字串中的子串是否是另乙個字元的排列 問題分析 陣列滑動視窗 map 將待匹配的字串轉化成字典來比較,每次滑動字串,只需要修改字典中首尾字元的數量即可。對於數量為0的字元,需要從map中刪除。如果不刪除,無法直接用字典相等來判斷。其他做了40分鐘,慢了。一遍準。鏈結bool chec...