1. 程式人生 > >劍指offer:字串的全排列

劍指offer:字串的全排列

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
class Solution {
public:
    vector<string> vs;
        
    vector<string> Permutation(string str) {
        //插排
        int size = str.size(); 
        if(size == 0)
            return vs;
        
        for(int i=1; i<size; ++i)
        {
            int j=i;
            while(str[j]<str[j-1] && j>=1)
            {
                char temp;
                str[j-1] = temp;
                str[j-1] = str[j];
                str[j] = temp;
                --j;
            }
        }
        //全排列
        perm(str, 0, size-1);
        
        return vs;
    }
    
    //改變字元位置,位置b的字元插入到位置a之前,保證插入後b之後的字元從小到大排列
    void ins(string &str, int a, int b)
    {
        if(a == b)
            return;
        else
        {
           string temp = str.substr(b,1); 
           str.erase(str.begin()+b);
           str.insert(a, temp); 
        }
    }
    
    //全排列函式
    void perm(string &str, int start, int end)
    {
        if(start>end)
            vs.push_back(str);
        else
        {
            for(int i=start; i<=end; ++i)
            {
               //相鄰的重複元素不進行交換操作 
               if(!(str[start] == str[i] && start != i))
               {
                 string temp = str;
                 ins(str, start, i);//原始的全排列這裡是swap
                 perm(str,start+1,end);
                 str = temp;
               }
            }
        }
    }
};