首先我们来说一下这个问题的基本算法,其实很简单,是一个典型的递归算法:
假设给定的字符串是 babc ([]中的为下一次递归的输入):
1. abbc 排序: 让相等的字符连续
2. a[bbc] 求解以第一个字符开头的组合
|
3. b[abc] 发现第二个字符b和上一组组合的头a 不相等,所以调换,并求解一新头(b) 开头的组合
4. abbc 还原上一次的交换
|
5. abbc b和第3步中的第一个字符b相等跳过(以b开头的组合已经在第3步中求解了)
|
6. c[bba] c和上一组组合的头(b) 不相等,所以调换,并求解一新头(c)开头的组合
#include <iostream> #include <algorithm> using namespace std; void SubPermutation(char a[], int start) { if(start==strlen(a)-1) { for(int i=0; i<=strlen(a)-1; i++) cout<<a[i]; cout<<endl; } else { char head=a[start]; for(int i=start; i<=strlen(a)-1; i++) { if(i==start) SubPermutation(a, start+1); else { if(a[i]!=head) { swap(a[i], a[start]); head=a[start]; SubPermutation(a, start+1); swap(a[i], a[start]); } } } } } void main() { char s[]="babc"; sort(s,s+strlen(s)-1);//先排序,让相等的字符连续 SubPermutation(s, 0); }