滑动窗口同数组的结合(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. 找到字符串中所有字母异位词
LeetCode 1658 将x减到0的最小操作数前缀和 滑动窗口 HERODING的LeetCode之路