题目链接
https://leetcode-cn.com/problems/permutation-in-string/
题目
给你两个字符串
s1
和s2
,写一个函数来判断s2
是否包含s1
的排列。换句话说,
s1
的排列之一是s2
的 子串 。
示例
示例 1:
输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").示例 2:
输入:s1= "ab" s2 = "eidboaoo"
输出:false
提示
1 <= s1.length, s2.length <=
s1
和s2
仅包含小写字母
思路
用一个滑动窗口从头开始依次遍历s2中每个子串,窗口长度等于s1匹配串,用两个哈希表分别存储s1所有字符及其个数,以及s2中当前长度一致的子串所有字符及其个数,每个字符个数一样即符合要求,返回true。
C++ Code
class Solution {
public:
bool Substring(unordered_map<char, int> S1,unordered_map<char, int> S2){
for(auto ch:S1)
{
if(ch.second!=S2[ch.first]) return false;
}
return true;
}
bool checkInclusion(string s1, string s2) {
if(s1.size()>s2.size()) return false;
unordered_map<char, int> S1; //s1中每个字符的个数
unordered_map<char, int> S2; //s2的当前子串中每个字符的个数
int n=s1.size();
for(char ch:s1) S1[ch]++;
for(int i=0;i<n;i++) S2[s2[i]]++;
if(Substring(S1,S2)==true) return true;
for(int i=1;i<=s2.size()-n;i++ )
{
S2[s2[i-1]]--;
S2[s2[i+n-1]]++;
if(Substring(S1,S2)==true) return true;
}
return false;
}
};