给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pe… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
--
滑动窗口
我举得跟双指针差不多,试一下双指针。
class Solution {
public boolean checkInclusion(String s1, String s2) {
//处理s1,放到hashMap中。
int[] list1 = new int[26];
int[] list2 = new int[26];
if (s1.length() > s2.length()) {
return false;
}
for (int i = 0; i < s1.length(); ++i) {
list1[s1.charAt(i) - 97]++;
list2[s2.charAt(i) - 97]++;
}
if (Arrays.equals(list1, list2)) {
return true;
}
for (int i = s1.length(); i < s2.length(); ++i) {
++list2[s2.charAt(i)-97];
--list2[s2.charAt(i-s1.length())-97];
if (Arrays.equals(list1, list2)) {
return true;
}
}
return false;
}
}
上面方法改进,不用Arrays.equals
直接计算数组Ascll之和,及其数组中数据个数 这是一位野生大佬的思路,膜拜
class Solution {
public boolean checkInclusion(String s1, String s2) {
if(s1.length() > s2.length())
return false;
//left,right表示整个窗口的范围
int sum = 0,count = 0,left = 0,right = s1.length()-1;
char[] chars = s1.toCharArray();
char[] chars1 = s2.toCharArray();
//统计s1的字符个数
int counts[] = new int[26];
for(int i = left;i <= right;i++){
sum += chars[i];
counts[chars[i] - 'a']++;
count += chars1[i];
}
if(sum == count) {
int counts1[] = new int[26];
for (int i = left; i <= right; i++)
counts1[chars1[i] - 'a']++;
//比较两个数组是否相等,如果相等则返回true
if (Arrays.equals(counts,counts1))
return true;
}
//滑动窗口并重复上述的操作
while(right < s2.length() - 1){
if(right+1 < s2.length()){
count = count - s2.charAt(left++) + s2.charAt(++right);
if(sum == count) {
int counts1[] = new int[26];
for (int i = left; i <= right; i++)
counts1[chars1[i] - 'a']++;
if (Arrays.equals(counts,counts1))
return true;
}
}
}
return false;
}
}