567. 字符串的排列
题意:
给你两个字符串
s1
和s2
,写一个函数来判断s2
是否包含s1
的排列。换句话说,
s1
的排列之一是s2
的 子串 。
示例 1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").
示例 2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
解题思路:
问 答 什么叫排序相等? 就是相同的字母,顺序不同 怎么判断? 在 s2
中寻找s1
长度的字符串,然后看字符是否排序相等怎么找 s2
中s1
长度的字符串?每次都在 s2
中取s1
长度,那就是滑动窗口如何判断两个是排序相等呢? 提示说只有字母,那么可以用数组来存, vector
容器有重载==,直接判断两个容器是否相等.
- 到这里就可以顺清楚脉络了,就是创建两个vector容器,然后每次压入滑动窗口的中的字母.判断是否相等即可
代码:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
//如果必要字符必字符集还长,直接返回.
if (s1.length() > s2.length())
return false;
//存必要字符
vector<int> needs(26, 0);
//存滑动窗口的字符
vector<int> windows(26, 0);
//压入必要字符
for (const char c : s1)
needs[c - 'a'] += 1;
//压入等长的数据
for (int i = 0; i < s1.length(); i++)
windows[s2[i] - 'a']++;
//如果刚好想到等直接返回
if (windows == needs)
return true;
//滑动窗口
int left = 0;
int right = s1.length();
while (right < s2.length())
{
//右边滑进窗口
windows[s2[right] - 'a']++;
//左边滑出窗口
windows[s2[left] - 'a']--;
//找到了就返回true
if (windows == needs)
return true;
left++;
right++;
}
//说明没找到
return false;
}
};
总结:
这道题用滑动窗口思想不难找,需要注意的是vector容器有重载
==
符号,可以直接判断是否相等.数组本身不大,判断起来速度很快.我在leetcode上运行的时间是0ms.所有不会有超时一说.