一般来说最小substring的问题 不是滑动窗口就是DP
https://leetcode.com/problems/minimum-window-substring/
暴力 双指针做法
有TLE, 这里可以再优化一下
当匹配上s的subarray和t时, 再用指针往回走,找到字符串匹配的头是在哪。
class Solution {
public String minWindow(String s1, String s2) {
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
int len2 = s2.length();
int len1 = s1.length();
int start = 0;
String ans = "";
int res = Integer.MAX_VALUE;
for(int i = 0, j = 0; i < len1; i++){
if(c1[i] == c2[j]){
if(j == len2 - 1){
int len = i - start + 1;
if(len < res){
res = len;
ans = s1.substring(start, i + 1);
i = start;
start++;
j = 0;
}
}else
j++;
}
}
return ans;
}
}
一般字符串s, 字符串t 两个字符串之间关系的题,都有DP解法
建立一个F[i][j]
Leetcode 76
https://leetcode.com/problems/minimum-window-substring/
1. 枚举,枚举所有的终点,然后找起点,这样可以枚举出所有的字符串,可以找到含有t的字符串
2. 怎么去比较是否含有t,用hash表,存t里各个字符出现的个数,再在枚举到的字符串里去比较是否出现了相应个数的
3. 这样做就算了很多重复的计算,比如 ABC含有ABC,那么你枚举DABC已经没有意义了。已经没有ABC短了。
4. 采用双指针进行优化。 结尾是i,开头是j,那么如果j所对应的字符map里又或者没有都不影响答案的时候,j就可以往后移了。又因为j这个字符如果对应的就不是t出现的字符,就直接往后移
枚举每一个终点,找到第一个满足含有所有字符的