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

劍指offer--字串的排列

題目描述

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

解析

這一題要用到全排列,我直接對原字串進行了全排列,然後再排序去重即可。

1.全排列的原理很簡單,就是每次從陣列中取走一個元素,使用遞迴即可搞定。

2.sort()函式完成了字串排序的功能。

3.unique()函式將相鄰的重複元素都移到了陣列最後,並返回重複陣列段的頭迭代器。

4.erase()函式去掉重複部分即可。

void method(vector<string> &result, string temp,string t ){
    if(temp.length()==0)return;
    for(int i =0;i<temp.length();++i){
        string newString = t;
        newString += temp[i];
        string newTemp = temp;
        newTemp.erase(i,1);
        method(result, newTemp, newString);
        if(newTemp.length()==0){
            result.push_back(newString);
            return;
        }
    }
}

vector<string> Permutation(string str) {
    vector<string> result;
    string t = "";
    method(result, str, t);
    sort(result.begin(),result.end());
    result.erase(unique(result.begin(),result.end()),result.end());
    return result;
}