输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
全排列,采用递归的思想
1)固定一端不动,求剩下的字符串的全排列,不断递归,
2)递归的终止条件是当m=k时表明已经是单个的字符全排列,而单个的字符全排列就是自身,此时递归终止
3)第一次交换是保证自身被插入到tmp中,第二次交换是为了维持递归出来字符串原来的样子。
但是为了排除aa的情况,我们要排除tmp中是否存在相同的字符串。
全排列的所有情况不是字典序的,所以我们要对tmp进行排列
class Solution {
public:
bool myfind(vector<string> &tmp,string str)
{
int i=0;
for(;i<tmp.size();i++)
{
if(tmp[i]==str)
return false;
}
return true;
}
void myprem(string &str,int k,int m,vector<string> &tmp)
{
if( k==m && myfind(tmp,str))
{
tmp.push_back(str);
}
else
{
for(int j=k;j<=m;j++)
{
swap(str[j],str[k]);
myprem(str,k+1,m,tmp);
swap(str[j],str[k]);
}
}
}
vector<string> Permutation(string str)
{
vector<string > tmp;
myprem(str,0,str.size()-1,tmp);
sort(tmp.begin(),tmp.end());
return tmp;
}
};