2022-7-24 剑指offer 滑动窗口
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
1 class Solution { 2 public boolean checkInclusion(String s1, String s2) { 3 int[] cnt1=new int[26]; 4 int[] cnt2=new int[26]; 5 for (int i=0;i<s1.length();i++){ 6 char c=s1.charAt(i); 7 cnt1[c-'a']++; 8 } 9 int l=0,r=0,n=s2.length(); 10 while (r<n){ 11 char c=s2.charAt(r); 12 cnt2[c-'a']++; 13 r++; 14 if (r-l<s1.length()){ 15 continue; 16 } 17 if (check(cnt1,cnt2)) return true; 18 else { 19 cnt2[s2.charAt(l)-'a']--; 20 l++; 21 } 22 } 23 return false; 24 } 25 26 public boolean check(int[] a,int[] b){ 27 for (int i=0;i<a.length;i++){ 28 if (a[i]!=b[i]) return false; 29 } 30 return true; 31 } 32 }
思路:滑动窗口。可以用差分优化。
浙公网安备 33010602011771号