给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
示例 2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路及方法
之前想的方法复杂且有错,所以还是看了官方解答,学会了滑窗。
设置窗口,一个是s1,一个是s2.,窗口的大小就是s1的长度。s1Arr和s2Arr记录的是当前窗口s1和s2出现字符的次数,s1Arr是不变的,s2Arr是可变的。
初始先判断两个窗口是否相等,相等就意味着包含s1的排列,返回true。否则从windowSize开始遍历,即相当于将s2的窗口向右边挪了一位,所以刚挪进来的那位字符出现次数++,挪出去的字符出现次数--,每遍历一次对比一次,相等返回true,一直到遍历结束,返回false。
class Solution {
public boolean checkInclusion(String s1, String s2) {
if (s1.length() > s2.length()) return false;
int[] s1Arr = new int[26];
int[] s2Arr = new int[26];
// 设置窗口及窗口大小
int windowSize = s1.length();
for (int i = 0; i < windowSize; i++) {
s1Arr[s1.charAt(i) - 'a']++;
s2Arr[s2.charAt(i) - 'a']++;
}
// 如果初始相等
if (Arrays.equals(s1Arr, s2Arr)) return true;
// 滑窗
for (int i = windowSize; i < s2.length(); i++) {
s2Arr[s2.charAt(i) - 'a']++;
s2Arr[s2.charAt(i - windowSize) - 'a']--;
// 如果窗口相等
if (Arrays.equals(s1Arr, s2Arr)) return true;
}
return false;
}
}
结果如下: