Sliding Window
题型
静态窗口
Code
class Solution {
public boolean checkInclusion(String s1, String s2) {
if (s1.length() > s2.length()) {
return false;
}
int[] amount = new int[26];
for (int i = 0; i < s1.length(); i++) {
// 滑动窗口: 维持一个和s1等长的窗口, 判断窗口包含的元素是否和s2包含的元素相同
// 初始把s1中所有元素放入
// 每次窗口右滑, 看作从中拿出新r, 并把旧l的字符还回去
// 正值表示该字符还没有被取完
// 0表示刚好.
// 负值表示该字符取过头了.
amount[s1.charAt(i) - 'a']++;
}
int l = 0, r = 0;
// curCount: 当前窗口中包含的s1元素个数
int targetCount = s1.length(), curCount = 0;
for (r = 0; r < s1.length(); r++) {
amount[s2.charAt(r) - 'a']--;
if (amount[s2.charAt(r) - 'a'] >= 0) {
curCount++;
}
}
// 当当前窗口包含s1个数和s1长度相同时,意味着s1所有的元素都出现在了窗口中.
if (curCount == targetCount) {
return true;
}
while (r < s2.length()) {
// tick the left out
// 如果要被移除的l被计入了curCount, 要先把窗口中包含s1元素的个数-1
if (amount[s2.charAt(l) - 'a'] >= 0) {
curCount--;
}
// 再把取出的还回去
amount[s2.charAt(l) - 'a']++;
l++;
// feed the new member
// 从amount取出, 表示放入了窗口
amount[s2.charAt(r) - 'a']--;
// 看放入窗口后是否多余.
if (amount[s2.charAt(r) - 'a'] >= 0) {
curCount++;
}
r++;
if (curCount == targetCount) {
return true;
}
}
return false;
}
}Analysis
Last updated