关于滑动窗口解决子串问题


目录

滑窗思想:

滑窗编程范式:

力扣76:最小覆盖子串

力扣438:找字符串中所有异位词

力扣3:无重复最长子串:


 

滑窗思想:

在解决字符串子串问题时,可以采用滑窗的思想;

1,在字符串S中使用双指针中左右指针技巧,初始化left = right = 0,把索引[left,right]成为一个窗口

2,不断增加right指针扩大窗口[left,right],直到窗口中字符串符合要求

3,停止增加right,同时不断增加left缩小窗口,直到窗口中字符串不再符合要求,同时每增加一次left更新一轮结果

4,重复2-4直到right到达字符串S的劲头。

 

滑窗编程范式:

// 滑窗思想解决字符串子串问题

int left = 0, right = 0;

while (right < s.size()) {
	window.add(s[right]);//滑动右边界
	right++;

	while (valid) {		//满足条件,滑动左边界,
		window.remove(s[left]);
		left++;
}
}

 

力扣76:最小覆盖子串

关于滑动窗口解决子串问题_第1张图片

代码实现:

class Solution {
public:
    string minWindow(string s, string t) {
        int start = 0,minLen = INT_MAX;
        int left = 0,right = 0;
        unordered_mapwindow;//统计窗内需要匹配的字母和频次
        unordered_mapneeds;//统计需要匹配的字母和频次
        for(auto c:t)
            needs[c]++;
        int matchs = 0;//统计字母匹配结果,如window有5个g,needs有5个g则g匹配
        while(right

测试结果:

关于滑动窗口解决子串问题_第2张图片

力扣438:找字符串中所有异位词

关于滑动窗口解决子串问题_第3张图片

代码实现:

class Solution {
public:
    vector findAnagrams(string s, string p) {
	vectorresult;
	int left = 0, right = 0;
	int match = 0;
	unordered_mapneeds;//记录需要异位的字符和频次
	unordered_mapwindow;//记录窗里面需要异位的字符及频次
	for (auto c : p)
		needs[c]++;

	while (right < s.size())
	{
		char c1 = s[right];
		if (needs.count(c1))//判断是不是需要异位的字母,进行窗记录
		{
			window[c1]++;
			if (window[c1] == needs[c1])
			{
				match++;
			}
		}
		right++;
		while (match == needs.size())
		{
			if (right - left == p.size())//字母匹配后判断长度匹配,否则可能窗内有多余非异位字母
			{
				result.push_back(left);
			}
			char c2 = s[left];
			if (needs.count(c2))//判断移除窗外的左边界是否异位词,更新window
			{
				window[c2]--;
				if (window[c2]

测试结果:

关于滑动窗口解决子串问题_第4张图片

力扣3:无重复最长子串:

关于滑动窗口解决子串问题_第5张图片

代码实现:

class Solution {
public:
   int lengthOfLongestSubstring(string s) {
	unordered_mapwindow;
	int left = 0, right = 0;
	int res = 0;
	while (right1)//有边界出现重复,移动左边界直到不重复为止;
		{
			char c2 = s[left];
			window[c2]--;
			left++;
		}
		res = max(res, right - left);
	}
	return res;
}
};

测试结果:

关于滑动窗口解决子串问题_第6张图片

 

参考:

力扣高票解答:https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong-yong-si-xiang-by-/

https://leetcode-cn.com/problems/minimum-window-substring/solution/zui-xiao-fu-gai-zi-chuan-by-leetcode-2/

你可能感兴趣的:(leetcode字符串)