问题
例子
思路
-
方法1 先排序,然后比较 O(n^2)
$$$$
-
方法2 O(n)
且空间复杂度使用两个数组,不像方法1,用好多个【比较一次用一个】
$$$$
-
方法3 使用一个数组
滑动窗口,窗口大小为s1.length(),向前滑动窗口时,把i-s1.length()下标的影响消去
代码
//方法1
class Solution {
public boolean check(int[] arr, int[] arr2) {
for(int i=0; i<arr.length; i++) {
if(arr[i]!=arr2[i]) return false;
}
return true;
}
public boolean checkInclusion(String s1, String s2) {
if(s1==null || s2==null || s1.length()>s2.length()) return false;
int[] arr = new int[26];
for(int i=0; i<s1.length(); i++)
arr[s1.charAt(i)-'a']++;
int len = s1.length();
for(int i=0; i+len-1<s2.length(); i++) {
if(arr[s2.charAt(i)-'a']>0) {
int[] arr2 = new int[26];
for(int j=i; j<i+len; j++)
arr2[s2.charAt(j)-'a']++;
if(check(arr,arr2)) return true;
}
}
return false;
}
}
//方法2
class Solution {
public boolean check(int[] arr, int[] arr2) {
for(int i=0; i<arr.length; i++) {
if(arr[i]!=arr2[i]) return false;
}
return true;
}
public boolean checkInclusion(String s1, String s2) {
if(s1==null || s2==null || s1.length()>s2.length()) return false;
int[] arr = new int[26];
int[] arr2 = new int[26];
for(int i=0; i<s1.length(); i++){
arr[s1.charAt(i)-'a']++;
arr2[s2.charAt(i)-'a']++;
}
if(check(arr,arr2)) return true;
for(int i=s1.length(); i<s2.length(); i++) {
arr2[s2.charAt(i-s1.length())-'a']--;
arr2[s2.charAt(i)-'a']++;
if(check(arr,arr2)) return true;
}
return false;
}
}
//方法3
class Solution {
public boolean check(int[] arr) {
for(int i=0; i<arr.length; i++) {
if(arr[i]!=0) return false;
}
return true;
}
public boolean checkInclusion(String s1, String s2) {
if(s1==null || s2==null || s1.length()>s2.length()) return false;
int[] arr = new int[26];
for(int i=0; i<s1.length(); i++){
arr[s1.charAt(i)-'a']++;
arr[s2.charAt(i)-'a']--;
}
if(check(arr)) return true;
for(int i=s1.length(); i<s2.length(); i++) {
arr[s2.charAt(i-s1.length())-'a']++;
arr[s2.charAt(i)-'a']--;
if(check(arr)) return true;
}
return false;
}
}