输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> *arr = new vector<string>;
arr->push_back(str);
int size = str.size();
exchange(0, arr, &str, size);
return *arr;
}
//交换a和a的后续字符,同时生成一个新的字符串,并将该字符串添加到arr中
void exchange(int a, vector<string> *arr, string *str, int size){
if(a >= size){
return;
}
//对于初始的字符串,我们总要调用一次交换函数
exchange(a+1, arr, str, size);
for(int i = a; i < size; i++){
string *new_str = new string(*str);
if(need_exch(a, i, str)){
std:swap(new_str->at(a), new_str->at(i));
arr->push_back(*new_str);
//对于交换后的字符串,需要额外调用交换函数,因为这与初始字符串完全不同
exchange(a+1, arr, new_str, size);
}
}
}
//判断在该string中,left和right位置的字符是否需要交换
bool need_exch(int left, int right, string *str){
if(left >= right){
return false;
}
for(int i = left; i < right; i++){
if(str->at(i) == str->at(right)){
return false;
}
}
return true;
}
};
首先,思路是通过交换来获得排列。让不同的字符首先和第一个字符交换,得到一系列字符串。然后让这些字符串的后续字符与第二个字符进行交换,让不同字符占领第二个位置。依次直到最后一个字符。
每次交换,必然会生成一个字符串,这个新字符串加入vector中,生成新字符串,意味着,这个新字符串的后续也需要进行交换。初始字符串自己需要调用一下交换函数,检验自己后续是否需要交换。
总而言之,初始字符串调用一次交换函数。后续没交换一次,则再调用一次交换函数。