采用分治法,把一个字符串看成两部分:第一部分是它的第一个字符,第二部分是后面的所有字符。这样字符串的全排列就变成了第二部分的全排列,前提是要将第一个字符的情况全部列举出来。
(1)首先求所有可能出现在第一个位置的字符,也就是把第一个字符和后面的所有字符交换;
(2)然后在把后面的字符串看成新的字符串从(1),如果最后只剩下一个字符,就输出字符串,递归结束。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h >
#include <string.h>
using namespace std;
inline void swap(char *a,char *b){
char c;
c = *a;
*a = *b;
*b = c;
}
template<class Type>
void Perm(Type list[],int k,int m){ //数组的第k个到第m个的全排列
if(k == m){ //如果k等于m了,递归结束
for(int i = 0;i <= m ;i++)
cout<<list[i];
cout<<endl;
}else{
for(int i = k; i <= m ;i++){
swap(list[k],list[i]); //第k个和第i个交换,让第k个出现所有可能的情况
Perm(list,k+1,m);
swap(list[k],list[i]); //交换回去 ,保证每次递归结束,数组不变
}
}
}
int main(){
char ch[6] = "hallo";
int length = strlen(ch);
Perm(ch,0,length-1);
return 0;
}