class Solution {
public boolean checkInclusion(String s1, String s2) {
//首先判断s1的长度是否小于s2,如果不小于直接返回false
if(s1.length() > s2.length()){
return false;
}
//创建hash表扫描s1统计s1中每个字符出现的次数,这里只包含26个小写字母所以可以使用一个26位的int数组来模拟hash表来降低空间复杂度,key也就是数组下表用于表示字符a-z,0代表啊,1代表b以此类推,value位s1中出现的字符的次数
//在这个过程中可以连着s2一起扫描统计出s2前s1.length()个字符的是否符合条件
int hash[] = new int[26];
for(int i = 0;i < s1.length();i++){
hash[s1.charAt(i) - 'a']++;
hash[s2.charAt(i) - 'a']--;
}
//判断是否符合条件
if(isZero(hash)){
return true;
}
//扫描s2剩下的字符的情况每次删除第一个字符末尾添加一个字符,每次扫描判断一下hash表中的出现次数是否都抵消位0
for(int i = s1.length();i < s2.length();i++){
//hash中减去第一个字符出出现的次数加上刚刚加入的字符的出现
hash[s2.charAt(i - s1.length()) - 'a']++;
hash[s2.charAt(i) - 'a']--;
//判断是否符合条件
if(isZero(hash)){
return true;
}
}
return false;
}
//判断hash表中的字符出现次数是否都是0个只要有一个不是0立即返回false
public boolean isZero(int[] array){
for(int num : array){
if(num != 0){
return false;
}
}
return true;
}
}
字符串中的变位词java实现
最新推荐文章于 2023-09-25 16:43:12 发布