解题思路
最开始想着用hashset来确认字符的出现情况,但最终发现有重复字符出现的情况所以无法使用
最后使用的是int类型的数组记录 因为题目说明“第一个字符串的排列之一”所以要考虑s1的所有情况
使用int也可以达到这个目的 因为只要最后字符出现次数相同就说明符合题意
最后就是使用滑动窗口right和left,每滑动一下就进行一次判断是否全部符合,如果不符就break
代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int n = s1.length(),right = 0,left = 0;
if(s2.length()<n){
return false;
}
int[] i1 = new int[26];
int[] i2 = new int[26];
for (int i = 0;i<n;i++){
i1[c1[i]-'a']++;
i2[c2[i]-'a']++;
right++;
}
boolean ans = true;
for (int i = 0;i<26;i++){
if (i1[i]!=i2[i]){
ans=false;
}
}
if (ans){
return true;
}
while (right<s2.length()){
ans = true;
i2[c2[right]-'a']++;
i2[c2[left]-'a']--;
for (int i = 0;i<26;i++){
if (i1[i]!=i2[i]){
ans=false;
break;
}
}
if (ans){
return true;
}
right++;
left++;
}
return false;
}
}