leetocde 567. Permutation in String
题意:给你两个字符串s1,s2,是否在s2中存在s1的全排列。
思路:统计s1各个数字的总数,然后在s2每个位置和s1比较。
代码1:O(26*n)
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int l1 = s1.length();
int l2 = s2.length();
vector<int> num(30, 0);
for (int i = 0; i < l1; i++)
num[s1[i] - 'a']++;
vector<vector<int>> dp(10005, vector<int>(30, 0));
for (int i = 0; i < l2; i++)
{
if (i == 0)
{
dp[i+1][s2[i] - 'a']++;
}
else
{
dp[i+1] = dp[i];
dp[i+1][s2[i] - 'a']++;
}
}
for (int i = l2; i >= 1 && i - l1 >= 0; i--)
{
int flag = 1;
for (int j = 0; j < 26; j++)
{
if (dp[i][j] - dp[i - l1][j] != num[j])
{
flag = 0;
break;
}
}
if (flag == 1) return true;
}
return false;
}
}
代码2:O(n)
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if(s1.size() > s2.size()) return false;
vector<int> dp1(30, 0);
vector<int> dp2(30, 0);
for (int i = 0; i < s1.size(); i++)
{
dp1[s1[i] - 'a']++;
dp2[s2[i] - 'a']++;
}
if (dp1 == dp2) return true;
for (int i = s1.size(); i < s2.size(); i++)
{
dp2[s2[i] - 'a']++;
dp2[s2[i - s1.size()] - 'a']--;
if (dp2 == dp1) return true;
}
return false;
}
};