字符串中的变位词
题目:
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例 1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例 2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
滑动窗口解法:
class Solution {
public boolean checkInclusion(String s1, String s2) {
char[] c1 = s1.toCharArray(), c2 = s2.toCharArray();
if(c1.length > c2.length) {
return false;
}
int[] a1 = new int[26], a2 = new int[26];
for(int i = 0; i < c1.length; i++) {
a1[c1[i] - 'a']++;
a2[c2[i] - 'a']++;
}
if(Arrays.equals(a1, a2)) {
return true;
}
for(int i = c1.length; i < c2.length; i++) {
a2[c2[i] - 'a']++;
a2[c2[i - c1.length] - 'a']--;
if(Arrays.equals(a1, a2)) {
return true;
}
}
return false;
}
}
双指针解法:
class Solution {
public boolean checkInclusion(String s1, String s2) {
char[] c1 = s1.toCharArray(), c2 = s2.toCharArray();
int len1 = c1.length, len2 = c2.length;
if(len1 > len2) {
return false;
}
int[] count = new int[26];
for(char c : c1) {
count[c - 'a']--;
}
int l = 0;
for(int r = 0; r < len2; r++) {
count[c2[r] - 'a']++;
// 当count所有元素都为 0 时说明此时s1 和 s2[l..r]是相等的
// 进入这个while时 说明count的元素除了 count[(c2[r] - 'a')] > 0其余元素都是 <= 0的
while(count[c2[r] - 'a'] > 0) {
count[c2[l] - 'a']--;
l++;
}
if(r - l + 1 == len1) {
return true;
}
}
return false;
}
}