滑动窗口同数组的结合(LeetCode 438.找到字符串中所有字母异位词&567.字符串的排列)

Posted 头号理想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口同数组的结合(LeetCode 438.找到字符串中所有字母异位词&567.字符串的排列)相关的知识,希望对你有一定的参考价值。

不就之前我写过一个关于滑动窗口的博文,其中是一些力扣中可以使用滑动窗口的方法解决的问题
地址:点这里!

然后今天又发现两个同类的问题 是使用数组和滑动窗口结合的问题

567.字符串的排列

这个题是2.10的每日一题

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

由题意我们知道 这个题不是和普通的滑动窗口一样
这个题判断的是 给定的字符串的排列 所以这点就值得我们思考使用什么方法去处理

由于字符的特殊的特征 我们可以使用数组来解决 因为26个字母都是连续的
我们创建两个数组 其中一个遍历给定的数组 为了和我们的滑动窗口的比较
另一个在窗口滑动的时候不断更新, 一旦两个数组相等 说明符合条件

代码

bool checkInclusion(string s1, string s2) 
	vector<int> count1(26, 0);
	vector<int> count2(26, 0);
	for (auto s : s1) 
		count1[s - 'a']++;
	

	//滑动窗口的模板(不了解的可以参考上边链接博文)
	int left = 0;
	int right = 0;
	while (right < s2.size()) 
		count2[s2[right] - 'a']++;
		if (right - left + 1 > s1.size()) 
			count2[s2[left++] - 'a']--;
		
		if (count1 == count2)  return true; 
		right++;
	
	return false;

438.找到字符串中所有字母异位词

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。


这个题和上边的题有很多相似的地方 首先就是滑动窗口的模式 以及处理的方法

 vector<int> findAnagrams(string s, string p) 
        vector<int> ans;
	vector<int> table1(26, 0);
	for (int i = 0; i < p.size(); i++) 
		table1[p[i]-'a']++;
	
	vector<int> table2(26, 0);
	int left = 0;
	int right = 0;
	while (right < s.size()) 
		table2[s[right] - 'a']++;
		if (right - left + 1 > p.size()) 
			table2[s[left] - 'a']--;
			left++;
		
		if (table1 == table2) 
			ans.push_back(left);
		
		right++;
	
	return ans;
    

希望上边的内容对大家有帮助

以上是关于滑动窗口同数组的结合(LeetCode 438.找到字符串中所有字母异位词&567.字符串的排列)的主要内容,如果未能解决你的问题,请参考以下文章

滑动窗口经典例题之一——438. 找到字符串中所有字母异位词

滑动窗口问题复习

LeetCode581-最短无序子数组(滑动窗口)

LeetCode 1658 将x减到0的最小操作数前缀和 滑动窗口 HERODING的LeetCode之路

LeetCode 1658 将x减到0的最小操作数前缀和 滑动窗口 HERODING的LeetCode之路

滑动窗口 - leetcode