滑动窗口之加法
public static String minWindow(String s, String t) {
int sLen=s.length();
int tLen=t.length();
//处理特殊情况
if (sLen==0||tLen==0||sLen<tLen)
return "";
char[] charArrayS=s.toCharArray();
char[] charArrayT=t.toCharArray();
//ascii('z')=122
int[] winFreq=new int[128];
int[] tFreq=new int[128];
for (char c: charArrayT){
tFreq[c]++;
}
//滑动窗口内部包含多少T中的字符,对应字符频数超过不重复计算
int distance=0;
//最小覆盖字串的长度
int minLen=sLen+1;
//对应起始位置的下标
int begin=0;
//左边界、右边界
int left=0;
int right=0;
//[left,right)
while(right<sLen){
//s字符串中第right个元素在t中没有,右边界往后移动
if(tFreq[charArrayS[right]]==0){
right++;
continue;
}
//维护distance
if (winFreq[charArrayS[right]]<tFreq[charArrayS[right]]){
distance++;
}
winFreq[charArrayS[right]]++;
right++;
//滑动窗口内部元素包含了t中所有元素
//此时左边界开始向右移动
while (distance==tLen){
//维护最小覆盖字串的长度和起始位置下标
if (right-left<minLen){
minLen=right-left;
begin=left;
}
//左边界中s字符串第left在t中没有,左边界右移
if (tFreq[charArrayS[left]]==0){
left++;
continue;
}
//左边界右移前判断 左边界中s字符串第left在t中个数,如果等于刚好等于窗口中的个数,此时要结束while
if (winFreq[charArrayS[left]]==tFreq[charArrayS[left]]){
distance--;
}
//左边界右移
winFreq[charArrayS[left]]--;
left++;
}
}
//没有更新最小覆盖字串
if (minLen==sLen+1){
return "";
}
return s.substring(begin,begin+minLen);
}
滑动窗口之减法
public static String minWindow(String s, String t) {
int sLen=s.length();
int tLen=t.length();
//处理特殊情况
if (sLen==0||tLen==0||sLen<tLen)
return "";
char[] charArrayS=s.toCharArray();
char[] charArrayT=t.toCharArray();
//ascii('z')=122
int[] tFreq=new int[128];
for (char c: charArrayT){
tFreq[c]++;
}
//滑动窗口内部还差多少T中的字符,对应字符频数超过不重复计算
int distance=tLen;
//最小覆盖字串的长度
int minLen=sLen+1;
//对应起始位置的下标
int begin=0;
//左边界、右边界
int left=0;
int right=0;
//[left,right)
while(right<sLen){
//维护distance
if (tFreq[charArrayS[right]]>0){
distance--;
}
tFreq[charArrayS[right]]--;
right++;
//滑动窗口内部元素包含了t中所有元素
//此时左边界开始向右移动
while (distance==0){
//维护最小覆盖字串的长度和起始位置下标
if (right-left<minLen){
minLen=right-left;
begin=left;
}
//左边界移除之后,需要出现的字符个数
if (tFreq[charArrayS[left]]==0){
distance++;
}
//左边界右移
tFreq[charArrayS[left]]++;
left++;
}
}
//没有更新最小覆盖字串
if (minLen==sLen+1){
return "";
}
return s.substring(begin,begin+minLen);
}
学以致用
滑动窗口的模板!