// hashtable 的方法
class Solution {
public:
/**
* @param s a string
* @param p a non-empty string
* @return a list of index
*/
vector<int> findAnagrams(string& s, string& p) {
// Write your code here
vector<int> res;
if(s.size()==0){
return res;
}
int hashtable[256]={0},temp[256]={0};
for(int i=0;i<p.size();++i){
hashtable[p[i]]++;
}
int i,j;
for(i=0;i<s.size()-p.size()+1;++i){
memset(temp,0,sizeof(temp));
for( j=i;j<p.size()+i;++j){
temp[s[j]]++;
}
for( j=0;j<256;++j){
if(hashtable[j]!=temp[j]){
break;
}
}
if(j==256){
res.push_back(i);
}
}
return res;
}
vector<string> svec;
void permutation(string &s,int pos){
if(pos==s.size()){
svec.push_back(s);
return ;
}
for(int i=pos;i<s.size();++i){
if(isswap(i,s)){
swap(s[i],s[pos]);
permutation(s,pos+1);
swap(s[i],s[pos]);
}
}
}
bool isswap(int k,string &num){ // 看后面是否有一样的
for(int i=k+1;i<num.size();i++){
if(num[k]==num[i]){
return false;
}
}
return true;
}
};
// 全排列的方法
class Solution {
public:
/**
* @param s a string
* @param p a non-empty string
* @return a list of index
*/
vector<int> findAnagrams(string& s, string& p) {
// Write your code here
vector<int> res;
if(s.size()==0){
return res;
}
sort(p.begin(),p.end());
svec.clear();
permutation(p,0);
size_t pos1;
for(int i=0;i<svec.size();++i){
if((pos1=s.find(svec[i]))!=string::npos){
res.push_back(pos1);
while((pos1=s.find(svec[i],pos1+1))!=string::npos){
res.push_back(pos1);
}
}
}
return res;
}
vector<string> svec;
void permutation(string &s,int pos){
if(pos==s.size()){
svec.push_back(s);
return ;
}
for(int i=pos;i<s.size();++i){
if(isswap(i,s)){
swap(s[i],s[pos]);
permutation(s,pos+1);
swap(s[i],s[pos]);
}
}
}
bool isswap(int k,string &num){ // 看后面是否有一样的
for(int i=k+1;i<num.size();i++){
if(num[k]==num[i]){
return false;
}
}
return true;
}
};