567. Permutation in String
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string's permutations is the substring of the second string.
Example 1:
Input:s1 = "ab" s2 = "eidbaooo" Output:True Explanation: s2 contains one permutation of s1 ("ba").
Example 2:
Input:s1= "ab" s2 = "eidboaoo" Output: False
1、首先是基本操作,TLE。
2、然后是微操。
注意:字符挨个存储不一定是map,vector也很好用,且复制貌似更快。
class Solution {
public:
bool checkInclusion(string s1, string s2)
{
if (s1.size() > s2.size()) return false;
sort(s1.begin(), s1.end());
for (int i = 0; i <= s2.size() - s1.size(); i++)
{
string temp = s2.substr(i, s1.size());
sort(temp.begin(), temp.end());
if (s1 == temp) return true;
}
return false;
}
};
class Solution {
public:
bool checkInclusion(string s1, string s2)
{
if (s1.size() > s2.size()) return false;
vector<int> chars(150, -1);
for (int i = 0; i < s1.size(); i++)
chars[s1[i]] = (chars[s1[i]] == -1) ? 1 : chars[s1[i]] + 1;
vector<int> chars_const = chars;
int k = 0;
int size = 0;
int start_pos = 0;
while (k < s2.size())
{
if (chars[s2[k]] == -1) //就没有这个字符
{
chars = chars_const;
start_pos = (++k);
size = 0;
}
else if (chars[s2[k]] > 0) //有这个字符 没被用过
{
if ( (++size) == s1.size()) return true;
chars[s2[k]] --;
k++;
}
else if (chars[s2[k]] == 0) //有这个字符,已经被用过了。
{
chars = chars_const;
k = (++start_pos);
size = 0;
}
}
return false;
}
};