class Solution {
private: string temp;
private: vector<string> result;
public:
vector<string> Permutation(string str) {
vector<string> result; //创建字符串数组
int len = str.length(); //求出字符串长度,作为参数传递控制循环次数
if(!len) return result; //当输入为空时,直接返回
BubbleSort(str,0,len-1);
Permutations(result, str, 0, len);
return result;
}
void Permutations(vector<string>&result, string str,int index, int len){
//当索引指向字符串尾部时,将str压入数组
if (index == len){//index==len,说明首位置已经是末尾了,这时的递归输入已经只有一个元素了
result.push_back(str);
return result;
}
for (int i = index; i < len; ++i) {
if (i!=index && str[i]== str[index]) continue;// 保证当输入多个重复字符时,不会重复计算
swap(str[i],str[index]);//每一次,交换第i个位置和首位置的元素
Permutations(result, str, index+1, len);
}
}
void BubbleSort(string &arr,int left,int high){
int i,j;
for(i=left;i<high;i++){
for(j=i+1;j<high;j++){
if(arr[i]>arr[j]){
swap(arr[i],arr[j]);
}
}
}
}
};
思路:首先将字符串进行排序,然后将字符串分为两部分,第一个字符和后边N-1个字符。然后从第2个字符开始轮番和第一个字符交换
swap(str[i],str[index]);//每一次,交换第i个位置和首位置的元素
解决此问题两步比较关键:(1):字典排序:解决这个问题要求在写排列之前先把字符串进行排序使用选择排序
void BubbleSort(string &arr,int left,int high){
int i,j;
for(i=left;i<high;i++){
for(j=i+1;j<high;j++){
if(arr[i]>arr[j]){
swap(arr[i],arr[j]);
}
}
}
}
(2)重复字母:此问题可以在进行交换时直接跳过
if (i!=index && str[i]== str[index]) continue;// 保证当输入多个重复字符时,不会重复计算