字符串全排列
来源:互联网 发布: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
- 字符串的全排列
- 字符串的全排列
- 字符串全排列问题
- 字符串全排列
- 字符串全排列问题
- 字符串全排列
- 求字符串全排列
- 求字符串全排列
- 字符串的全排列
- 字符串全排列代码
- 字符串全排列
- 字符串全排列
- 字符串全排列
- 字符串的全排列
- 字符串全排列
- 求字符串全排列
- 字符串全排列
- 字符串的全排列
- hpuoj 1725: 感恩节KK专场——特殊的比赛日期 【素数判断】【校赛】
- Ninja - chromium核心构建工具
- xcode插件
- 【Linux学习笔记】Shell 基础(1) — Shell简介
- Apache搭建多个站点方法详解
- 字符串全排列
- ubuntu远程控制其他电脑(window & linux)
- 变量的声明和定义有什么区别
- 地理信息系统基础算法(二)判断两线段是否相交
- Tomcat设置系统启动
- pat 1030. Travel Plan (30)
- C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex
- 黑马程序员——OC学习——self和super关键字
- UML---活动图