字符串全排列

来源:互联网 发布:linux git 编辑:程序博客网 时间:2024/05/21 05:41
<本算法采用固定位置的方法,递归; </p><p>把a固定在第一位,然后再求后面的排列;把b固定,把c固定,把。。。。固定;到最后一个字符时,输出,然后恢复初始字符串,交换下一位;还有一种情况是字符串中出现重复字符,加一个判断函数ifswap();如果与当初i相同的元素已经参与过交换,那么就不再交换了;
#include<stdio.h>
#include<stdlib.h>/**/void swap(char *str,int a,int b) // 交换函数,用于让不同的字符到达第一位 {char temp;temp=str[a];str[a]=str[b];str[b]=temp;}//去重全排列 bool ifswap(char *str,int begin,int end)   //从begin到end的区间内是否有元素与end重合,如果有,就不交换,否则,就交换 {int i;for(i=begin;i<end;i++) {if(str[i]==str[end])return false;}return true;}  void All(char *str,int from,int to) {int i;if(to<=1)//只有一个或者两个字符的时候, return ;if(from==to)// from已经遍历到最后一位,出现了一种排列,输出 {printf("%s\n",str);}else{for(i=from;i<=to;i++)  // 从from开始,依次让str内的字符,作为第一位出现 {if(ifswap(str,from,i)){swap(str,i,from);// 通过swap将其换到第一位, All(str,from+1,to);// 递归,找从from+1--to时候,固定from+1位置;以此类推 swap(str,i,from);  //将字符串恢复到原来的顺序,以免i++时,字符串顺序错乱 }}}}int main(){char str[]="aac";All(str,0,2);system("pause");return 0;}



tips:

1,swap的时候单纯传递两个数组元素进去是没办法完成物理上的交换,必须传递数组或者数组指针;


0 0
原创粉丝点击