题目:
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:采用滑动窗口的解法。
同438题类似,只是返回类型是布尔类型。
class Solution {
public boolean checkInclusion(String s1, String s2) {
if (s1.length() == 0 || s2.length() == 0) return false;
Map<Character, Integer> need = new HashMap<>();
Map<Character, Integer> window = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
char c = s1.charAt(i);
need.put(c, need.getOrDefault(c, 0) + 1);
}
System.out.println(need.size());
int left = 0;
int right = 0;
int valid = 0;
/* int start = 0;
int end = 0;
int len = 0;*/
while (right < s2.length()) {
Character c = s2.charAt(right);
right++;
//对窗口有效值进行更新
if (need.containsKey(c)) {
window.put(c, window.getOrDefault(c, 0) + 1);
if (window.get(c).equals(need.get(c))) {
valid++;
}
}
System.out.println("valid:"+valid);
System.out.println("left:" + left + " right:" + right);
//判断左侧窗口是否要收缩
//当窗口长度>=need长度时,开始收缩
while (right - left >= s1.length()) {
//判断是否找到合法字符串
if (valid == need.size()) return true;
Character d = s2.charAt(left);
left++;
//对窗口有效值进行更新
if (need.containsKey(d)) {
if (window.get(d).equals(need.get(d))) {
valid--;
}
window.put(d, window.getOrDefault(d, 0) - 1);
}
}
}
//未找到合适的字符串
return false;
}
}