问题描述:
编程输出一个字符串的所有排列
示例:
input a string:ABC
ABC
ACB
BAC
BCA
CAB
CBA
方法:采用递归调用的方法。定义一个函数,每次将第i个位置作为开头字母,然后将后面的字符串递归调用该函数进行全排列。比如ABC,开始时将A作为开头字母,然后将BC传入递归函数中,然后在递归中以B作为开头字母,将C传入递归函数中,此时只有一个字母,我们认为全排列结束,输出结果ABC。回到以B开头的递归调用后面,转而以C作为开头字母,然后将B传入递归函数中,输出ACB。此时回到以A开头的递归中,换成B作为开头字母,将AC传入递归调用中..........分别得到BAC,BCA......
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void swap(char s[],int a,int b){//将a位置的字母与b位置的字母交换
char temp;
temp=s[a];
s[a]=s[b];
s[b]=temp;
}
void array(char s[],int start,int end){
int i;
if(start==end){//此时只有一个字母进行全排列,排列结束输出
printf("%s\n",s);
}
else{
for(i=start;i<=end;i++){//从第一个字母开始与自己和后面的字母换位置,实现不同字母作为开头
swap(s,start,i);//将第i个字母与开头字母交换
array(s,start+1,end);将第一个字母后的其他字母递归调用进行全排列
swap(s,start,i);//还需恢复最开始的状态,以进行下一个字母交换
}
}
}
int main(){
char s[81];
gets(s);
printf("the result is:\n");
int len=strlen(s);//计算字符串长度,避免每次手动输入
array(s,0,len-1);
return 0;
}
运行结果截图: