每天一道算法题(39)——含有重复字符的全排列
思路
(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); }