输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
求整个字符串的排列,可以看成2步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。第二部固定第一个字符,求后面所有字符的排列。这个时候仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。
#include<stdio.h>
#include<stdlib.h>
//递归回溯法->深度优先遍历
void recusive(char* pstr,char* begin){
if(*begin =='\0'){
printf("%s\n",pstr);
}else{
for(char* pch =begin;*pch!='\0';++pch){
char temp = *pch;
*pch = *begin;
*begin = temp;
recusive(pstr,begin+1);
temp = *pch;
*pch = *begin;
*begin = temp;
}
}
}
void permutation(char* pstr){
if(pstr==NULL)
return;
recusive(pstr,pstr);
}
int main(){
char s[] = "abcd";
permutation(s);
system("pause");
return 0;
}