字符串中是否包含所有子字符串

// 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;
    }
};

猜你喜欢

转载自blog.csdn.net/u010325193/article/details/86517429