【剣指offer】文字列の並び(遡及)
7727 ワード
タイトルの説明
文字列を入力し、その文字列のすべての配列を辞書順に印刷します.例えば文字列abcを入力すると、文字a,b,cで並べられるすべての文字列abc,acb,bac,bca,cab,cbaが印刷される.
説明の入力:9を超えない文字列を入力します(文字が重複する可能性があります)、文字には大文字と小文字のみが含まれます.
構想
注意:(1)重複要素はスキップする必要があります.そうしないと、重複配列が出力されます(2)サブ列の全配列が得られた後、交換された要素を復元する必要があります.
コード#コード#
文字列を入力し、その文字列のすべての配列を辞書順に印刷します.例えば文字列abcを入力すると、文字a,b,cで並べられるすべての文字列abc,acb,bac,bca,cab,cbaが印刷される.
説明の入力:9を超えない文字列を入力します(文字が重複する可能性があります)、文字には大文字と小文字のみが含まれます.
構想
abc
を例にとると、(1)文字列を2つの部分、ヘッダ要素、および残りの要素に分ける.(2)最初の要素を他の要素と絶えず交換する.(3)残りの要素からなる文字列内を再帰的に全配列する.(4)最後の要素に交換するまで、現在の配列を出力する.注意:(1)重複要素はスキップする必要があります.そうしないと、重複配列が出力されます(2)サブ列の全配列が得られた後、交換された要素を復元する必要があります.
コード#コード#
class Solution {
public:
vector<string> Permutation(string str) {
if (str.empty())
return vector<string>();
if (str.size()==1)
return vector<string> {str};
vector<string> res;
PermutationCore(str,0,res);
//
sort(res.begin(),res.end());
return res;
}
void PermutationCore(string str ,int begin, vector<string> &res) {
if (begin >= str.size()){
res.push_back(str);
return;
}
for (int i = begin; i < str.size(); ++i) {
// ;
if (str[begin] == str[i] && begin!=i){
continue;
}
//
char tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
PermutationCore(str,begin+1,res);
//
tmp = str[begin];
str[begin] = str[i];
str[i] = tmp;
}
}
};