题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
**题解:**先将第一个数字与后面每一个数字进行交换,然后排列后面的(begin + 1,end)个数。排列完成之后,将交换后的数交换回来,方便下一次进行交换。
主干部分:
- swap(str[i],str[begin]);//全排列,交换第一个字符和第i个字符的位置
- perm(v,str,begin + 1,end);
- swap(str[i],str[begin]);//然后把字符交换回原来的位置,再进行下一个位置的交换。
class Solution {
public:
void perm(vector<string>& v, string str, int begin, int end){
if(begin == end){
v.push_back(str);
}
for(int i = begin;i <= end; i++){
if(i != begin && str[i] == str[begin])//有重复字符时,跳过
continue;
swap(str[i],str[begin]);//全排列,交换第一个字符和第i个字符的位置
perm(v,str,begin + 1,end);
swap(str[i],str[begin]);//然后把字符交换回原来的位置,再进行下一个位置的交换。
}
}
vector<string> Permutation(string str){
vector<string> v;
int begin = 0;
int end = str.size();
if(str.empty() || end == 0)
return v;
perm(v,str,begin,end - 1);
sort(v.begin(),v.end());
return v;
}
};