题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中
还是先来一张图片比较好说明:先固定好第一个数,然后后面的数再一次排列。如下图(0,3)代表【0,3)。(1,3)代表【1,3)
例一:
#include#include #include void f(char *str, int len, int n){ int i; char tmp; char *p = (char *)malloc(sizeof(*str)); if(n==len-1){ //只剩一个元素 printf("%s\n",str); //打印 }else{ for(i=n;i
参考文章:
实现二:
#include#include //函数功能 : 求一个字符串某个区间内字符的全排列 //函数参数 : pStr为字符串,begin和end表示区间 //返回值 : 无 //九度1369 void swap(char *a,char *b){ char temp; temp=*a; *a=*b; *b==temp; }void Permutation_Solution1(char *pStr, int begin, int end) { char *p = (char *)malloc(sizeof(*pStr)); if(begin == end - 1) //只剩一个元素 { int i; //for(i = 0; i < end; i++) //打印 printf("%c\n",pStr[i]); printf("%s\n",pStr); } else { int k; char tmp; for(k = begin; k < end; k++) { strcpy(p,pStr); tmp = *(pStr+begin); //交换两个字符 *(pStr+begin) = *(pStr+k); *(pStr+k) = tmp; Permutation_Solution1(pStr, begin + 1, end); //递归 strcpy(pStr,p); } } } int main(void){ char str[] = "abc"; int len = strlen(str); Permutation_Solution1(str, 0, len); return 0;}
例一去掉重复的排列应该可以通过