給定兩個字符串 s1 和 s2,寫一個函數來判斷 s2 是否包含 s1 的排列。
換句話說,第一個字符串的排列之一是第二個字符串的子串。
示例1:
輸入: s1 = “ab” s2 = “eidbaooo”
輸出: True
解釋: s2 包含 s1 的排列之一 (“ba”).
解題思路
和s1每個字符的個數對應相等,則為s1的一個排列。使用數組維護滑動窗口內字符的個數,并且記錄已經配對字符的個數,當需要配對字符個數為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字符的個數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--;//當增加的字符不是多余的字符時,需要配對的字符數才能減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)//去掉的不是多余的字符時,需要配對的字符數才能加1cur++;}l++;}}return false;}
}