题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> strVec;
if (str.size() == 0){
return strVec;
}
Permutation(str, 0, strVec);
sort(strVec.begin(), strVec.end());
return strVec;
}
//字符串的排列,先选择第一个位置的字母,第一个位置的字母选定以后,再对字符串中剩余的其他字母排序
//一开始我的想法是不在原先字符串上操作,新建一个新的字符串作为排序后的字符串,但是这样比较复杂,感觉
//没有思路进行下去
//剑指offer上给出的思路:采用递归的方法,并且可以直接在原先的字符串上进行操作
//1、先选定排序结果字符串第一位置上的字符,方法是分别拿字符串第一个位置上的字符与其它位置上的字符交换位置
//2、再对第一个位置后面的字符进行排序(又是字符串的排序,递归)。
//递归的出口:如果待排序字符串的长度为1,则递归结束,说明得到了一个字符串的排序
void Permutation(string &str, size_t begin, vector<string> &strVec){
if (begin == str.size() - 1){
strVec.push_back(str);
return;
}
for (size_t i = begin; i <= str.size() - 1; i++){
if (i != begin && str[i] == str[begin]) {
continue;
}
if (str[begin] != str[i]){
char temp = str[begin];
str[begin] = str[i];
str[i] = temp;
}
Permutation(str, begin + 1, strVec);
//恢复排序前字符串的状态进行下一轮的排序
char temp = str[begin];
str[begin] = str[i];
str[i] = temp;
}
return;
}
};

本文介绍了一个使用递归实现的字符串全排列算法,该算法能在原字符串上操作,避免额外内存开销,通过交换字符位置来生成所有可能的排列组合,并确保结果按字典序输出。
438

被折叠的 条评论
为什么被折叠?



