一:题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
二:解题思路
参考剑指Offer:
把一个字符串可以看成由两部分组成:
第一部分:它的第一个字符串
第二部分:后面所有的字符串
求整个字符串的的排列,可以看成两步:
首先求所有可能的出现在在第一个位置的字符,即将第一个字符与后面所有字符交换
第二固定第一个字符,求后面所有字符的排列
三:代码实现
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> array;//保留最终的全排列结果
if(str.size()==0) //边界条件,空字符串
return array;
Permutation(array,str,0);
sort(array.begin(),array.end()); //对array按照字典顺序输出
//很巧妙的办法,省略了统计字母出现的次数,并按字典顺序排列后的前期工作
return array;
}
void Permutation(vector<string> &array,string str,int begin){
if(begin==str.size()-1)
array.push_back(str);
//遍历第begin位的所有可能性
for(int i=begin;i<str.size();i++){
if(i!=begin && str[i]==str[begin])//重复字符跳过
continue;
swap(str[i],str[begin]);//交换,使第begin位取到begin后不同的可能字符,再遍历后面的字符
Permutation(array,str,begin+1);//遍历其后面的所有字符
swap(str[i],str[begin]);//复位
}
}
};