3、字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo"
输出: False
注意:
1、输入的字符串只包含小写字母
2、两个字符串的长度都在 [1, 10,000] 之间
Solution:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
string substr;
int i,j;
vector<int>m(26,0);
vector<int>b(26,0);;
if(s1.size()>s2.size())
return false;
for(i=0;i<s1.size();i++){
m[s1[i]-'a']++;
}
for(i=0;i<=s2.size()-s1.size();i++){
substr=s2.substr(i,s1.size());
b=m;
for(j=0;j<s1.size();j++){
if(b[substr[j]-'a']==0)
break;
else
b[substr[j]-'a']--;
}
if(j==s1.size())
return true;
}
return false;
}
};
思路:
因为输入只有小写字母,所以可以用一个26大小的数组存储s1中每个字符出现的次数,然后按s1的大小从s2中获取子字符串,只要检查一下该子字符串的字符是否和统计的一样就行了。不过效率不是很高。