leetcode 567. 字符串的排列(滑动窗口)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 567. 字符串的排列(滑动窗口)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
給定兩個字符串 s1 和 s2,寫一個函數(shù)來判斷 s2 是否包含 s1 的排列。
換句話說,第一個字符串的排列之一是第二個字符串的子串。
示例1:
輸入: s1 = “ab” s2 = “eidbaooo”
輸出: True
解釋: s2 包含 s1 的排列之一 (“ba”).
解題思路
和s1每個字符的個數(shù)對應相等,則為s1的一個排列。使用數(shù)組維護滑動窗口內字符的個數(shù),并且記錄已經(jīng)配對字符的個數(shù),當需要配對字符個數(shù)為0,則滿足條件。
代碼
class Solution {public boolean checkInclusion(String s1, String s2) {int l=0,r=0;HashSet<Integer> objects = new HashSet<>();int k=s1.length(),n=s2.length(); int[] tar=new int[26];int cur=k;for (int i = 0; i < k; i++) {//記錄s1字符的個數(shù)tar[s1.charAt(i)-'a']++;objects.add(s1.charAt(i)-'a');}while (r<n){if(objects.contains(s2.charAt(r)-'a')){tar[s2.charAt(r)-'a']--;int i = tar[s2.charAt(r) - 'a'];if(i >=0) cur--;//當增加的字符不是多余的字符時,需要配對的字符數(shù)才能減1if(cur==0) return true;}r++;while (r-l+1>k){if(objects.contains(s2.charAt(l)-'a')){if(++tar[s2.charAt(l)-'a']>0)//去掉的不是多余的字符時,需要配對的字符數(shù)才能加1cur++;}l++;}}return false;} }總結
以上是生活随笔為你收集整理的leetcode 567. 字符串的排列(滑动窗口)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 992. K 个不同整
- 下一篇: 梦到自己生了大病什么意思