Leetcode 567. 字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
class Solution {
public boolean checkInclusion(String s1, String s2) {
char [] res1 = s1.toCharArray();
char [] res2 = s2.toCharArray();
int[] count1 = new int[26];//记录s1中字符出现的个数
int[] count2 = new int[26];//记录窗口中
int l1 = res1.length;
int l2 = res2.length;
//滑动窗口大小固定为l1
int left = 0;
int right = l1-1;
if(l1>l2){//记得加这个条件
return false;
}
for(int i =0;i<=right;i++){//统计s1中字符出现的个数
count1[res1[i]-'a']++;
}
for(int i =0;i<right;i++){//添加初始滑动窗口,只添加到right-1
count2[res2[i]-'a']++;
}
while(right<l2){
count2[res2[right]-'a']++; //将right位置添加进滑动窗口
if(Arrays.equals(count1, count2)) {//比较两者是否相同,相同则说明是子串(因为不需要顺序相同)
return true;
}
else{
right++;
count2[res2[left]-'a']--;//将left移出滑动窗口
left++;
}
}
return false;
}
}