题目
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
题解
- s2包含s1的排列:s2的子串与s1中字母的类型与数量都相等
- 先统计s1中每个字符的数量
- 双指针:不断扩大s2的右边界
- 在扩大右边界的过程中,若当前窗口的大小等于s1的长度,则去判断该窗口所形成的字符串是否是s1的排列
- 若不是s1的排列,跳出并且左指针右移;若是则直接返回
参考代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
int[] strs = new int[];
for(int i = 0; i < s1.length(); i++) {
strs[s1.charAt(i)-'a']++;
}
int left = 0, right = 0;
boolean flag = true;
while(right < s2.length()) {
char cur = s2.charAt(right);
strs[cur-'a']--;
if(right - left + 1 == s1.length()) {
for(int i = 0; i < 26;i++) {
if(strs[i] != 0) {
flag = false;
break;
}
}
if(flag) return true;
strs[s2.charAt(left++)-'a']++;
}
right++;
}
return false;
}
}