滑动窗口
在letecode编程中经常会碰到一类寻找最长序列的问题,这个时候都可以采用滑动窗口的算法
滑动窗口就是控制一个双指针left, right, 没有达到极限条件的时候right指针,操作临界条件
就让left指针,然后更新这个最长序列。
比如下面的的问题:
问题一:给你两个长度相同的字符串,s 和 t。
将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。
如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。
解题方法就是采用滑动窗口的方法进行,代码如下:
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
std::vector<int> diff(s.length());
for (int i = 0; i < s.length(); i++)
{
diff[i] = abs(s[i] - t[i]);
}
int right =0;
int left = 0;
int sum = 0;
int maxlen = 0;
while (right < diff.size())
{
sum = sum + diff[right];
while(sum > maxCost)
{
sum = sum - diff[left];
left = left +1;
}
maxlen = max(maxlen, right-left + 1);
right= right+1;
}
return maxlen;
}
};
问题二:给定一个字符串,可以将某一个字符替换成其他字符,现在假定最大的替换次数为k,请找出最后字符串中最长的重复子串。
思路处理还是一样的,代码如下:
int findMaxlen(string s, int k)
{
std::vector<int> couts(26, 0)
int left = 0;
int right = 0;
int maxLen = 0;
while (right < s.length())
{
couts[s[right] -'A']++;
maxLen = max( maxLen , couts[s[right] -'A']);
while(right -left+1-maxLen > k)
{
couts[s[left] -'A']--;
left++;
}
right++;
}
return right - left;
}