题目
给定两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的子串;
示例 1:输入: s1 = "ab" s2 = "eidbaooo"
输出: True
示例 2:输入: s1= "ab" s2 = "eidboaoo"
输出: False
提示:1 <= s1.length,s2.length <= 10^4
s1 和 s2 仅包含小写字母
解题思路
思路是利用滑动窗口来实现,将每个字母出现的次数使用数组储存起来,利用滑块将每次截取的部分储存在第二个数组里面,对比两个数组每个字母出现的次数是否相当就可以判断是否为变位词,注意的地方是如果一个字母并没有出现,这时两个情况都为零,但是两者是相等的,故直接判断不相等即可,还有就是每次截止之前将第二个数组置空。
完整代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
int l = s1.length();
boolean judge = false;
int [] num1 = new int[26];
int [] num2 = new int[26];
for (int i = 0; i < l; i++) {
int index = Character.hashCode(s1.charAt(i)) - 97;
num1[index]++;
}
for (int i = 0; i < s2.length() - l + 1; i++) {
String cString = s2.substring(i, i+l);
for (int j = 0; j < l; j++) {
int index = Character.hashCode(cString.charAt(j)) - 97;
num2[index]++;
}
for (int j = 0; j < num2.length; j++) {
if (num1[j] != num2[j]) {
judge = false;
break;
} else {
judge = true;
}
}
if (judge) {
break;
}
for (int j = 0; j < num2.length; j++) {
if (num2[j]>0) {
num2[j] = 0;
}
}
}
return judge;
}
}