Q:输入一个字符串,按字典序打印出该字符串中字符的所有排列,例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba
思路:
- 把一个字符串可以分为两个部分,第一部分为字符串的首字符,第二部分为剩下的字符串
- 要求字符的全排列,就是把一个位置的字符依次与后面每个位置的字符进行交换得到新的字符串
- 首先固定第一个字符,求后面所有字符的全排列;而后面字符又可以分为第一个字符以及第一个字符之后的所有字符,把第一个字符逐个与后面的每一个字符进行交换;
- 因此我们可以采用递归的方法来解决
简单画图:
代码:
class Solution {
public:
vector<string> res;
vector<string> Permutation(string str) {
if(str.size()==0)
return res;
int size=str.size();
Get(str,0,size);
sort(res.begin(),res.end());
auto it= unique(res.begin(),res.end()); //去重
res.erase(it,res.end());
return res;
}
void Get(string& str,int i,int len)
{
if(str[i]=='\0')
res.push_back(str);
else
{
for(int start=i;start<len;++start)
{
swap(str[i],str[start]);
Get(str,i+1,len);
swap(str[i],str[start]);
}
}
}
};
注意:两次swap的目的是,第一次是为了交换当前位置的字符和后面字符的位置;第二次是为了还原成上一次的字符串,防止出现重复组合;例如abcd,交换后可以变成acbd,如果不还原就交换会再次得到abcd;