思路
(1)对于含有重复字符的全排列必须使用isSwap函数
(2)整体思路
a,交换当前子字符串(i----n-1)字符与子字符串后面的每一个位置的字符(满足交换条件下)
b,子字符串位置后移(i+1-----n)。递归处理子字符串
c,将a中的交换复原。
代码
#include <iostream>
#include"string"
using namespace std;
void swap(char& a,char& b){//交换
char temp=a;
a=b;
b=temp;
}
//***************************判断是否交换**********************************************************//
//当前需要交换的位置为m, 被交换的字符位置为n ,则s[n]应该异于s[m]---s[n-1]之间的任意一个字符
bool isSwap(string s,int m,int n){
for(int i=m;i<n;i++)
if(s[i]==s[n])
return false;
return true;
}
//递归全排列
void permute(string s,int n){
if(n+1==s.length()){
cout<<s<<endl;
return;
}
permute(s,n+1);
char temp;
for(int i=n+1;i<s.length();i++){
if(isSwap(s,n,i)){
swap(s[n],s[i]);
permute(s,n+1);
swap(s[n],s[i]);
}
}
}
void main(){
string s("12233");
permute(s,0);
}