描述
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
分析
滑动窗口固定长度遍历s2,若窗口内的字符个数与字符种类与s1的一致,则说明存在,否则不存在。
比较两个字符串的排列是否相等,可以用字频数组存储字符个数,比较两个数组是否一致来判断。
class Solution {
public boolean checkInclusion(String s1, String s2) {
if (s1.length() > s2.length()) {
return false;
}
Map<Character,Integer> map = new HashMap<>();
for (int i = 0; i < s1.length(); i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
map.put(c1,map.getOrDefault(c1,0)-1);
map.put(c2,map.getOrDefault(c2,0)+1);
}
int dif = 0;
for (char ch : map.keySet()) {
dif += Math.abs(map.get(ch));
}
if (dif == 0) {
return true;
}
for (int i = s1.length(); i < s2.length(); i++) {
char r = s2.charAt(i);
char l = s2.charAt(i-s1.length());
if (l == r) {
continue;
}
if (map.getOrDefault(r,0) >= 0) {
dif++;
} else {
dif--;
}
if (map.get(l) <= 0) {
dif++;
} else {
dif--;
}
if (dif == 0) {
return true;
}
map.put(r,map.getOrDefault(r,0)+1);
map.put(l,map.get(l)-1);
}
return false;
}
}