c++字符串全排列递归法
网上关于字符串全排列的代码一大堆,总体而言分为递归法和非递归法两种实现。虽然递归法原理简单,代码简洁,但是我观察众多博客来看,没有把代码讲透,只有透过代码才能看清算法的本质。
问题:输入一字符串(要求不存在重复字符),打印出该字符串中字符中字符的所有排列。
例如:输入”abc”,输出结果为abc, acb, bac, bca, cab和cba。
递归思路:看成两步:
1、首先求所有可能出现在第一个位置的字符,可以把第一个字符和后面的字符一次交换;
2、固定第一个字符后,求后面字符的全排列,过程类似第一个字符的取法,即递归调用
也可以这么理解,f(abc) = a + f(bc), f(bc) = b + f(c),
讲了基本的思想,我们还是重点来看代码(这是网上摘抄,非作者本人所写),通过代码就能很好的理解了。
#include<iostream>
using namespace std;
#include<assert.h> void Permutation(char* sourceStr, char* changeStr)
{ assert(sourceStr && changeStr);//断言,防止越界 if(*changeStr== '\0') printf("%s\n",sourceStr);//如果没有可交换字母,已经到末尾,将源字符串输出 else { //比如源字符串当前是sourceStr="abc",交换字符串也为changeStr="abc",//需要注意的是,函数void Permutation(str,str)传的是指向同一个字符串的指针for(char* pCh = changeStr; *pCh != '\0'; pCh++) { swap(*changeStr,*pCh);//交换第一个和后面一个 Permutation(sourceStr, changeStr+1);//固定前面的,后面再排列 swap(*changeStr,*pCh);//再换回原来的 } }//一次完整的打印是这样的,首先sourceStr、changeStr都指向"abc",接着swap第一个,结果还是"abc",
//这个时候就会输出'abc'。接着会退回的固定'a','b'和'c'进行交换,这个时候//sourceStr="acb",经过后面全排列后,又会换回来,这样"acb"也就打印出来
} int main(void)
{ char str[] = "abc"; Permutation(str,str); return 0;
}
自己可以画图,将流程走一遍,或者设置断点调试,就能清楚的看到实现的机制了。
c++字符串全排列递归法相关推荐
- 递归法:求n个元素的全排列
问题:求n个元素的全排列 举例:ABC 其全排列有ABC ACB BAC BCA CAB CBA 法一: 采用分割的思想把第一个元素和后面的其他元素分开思考将问题简单化 public class Qu ...
- 零基础学Python———求一个字符串的每个字符重新组合排列python排列组合的数学运算(递归法)
1.数学知识温习 全排列的公式为: Anm:A _n^m : Anm: 以 " AABBCC " 为例,全排列的公式有: A66=6!:A _6^6 = 6! : A66=6! ...
- C语言-递归法将一个数字转换成字符串
任务描述 本关任务:用递归法将一个整数 n (任意位数的整数)转换成字符串,并输出,各个字符之间用空格隔开. 例如,输入483,应输出字符串4 8 3. 测试输入:123456789 预期输出:1 2 ...
- 用递归法将一个整数n转换成字符串
用递归法将一个整数n转换成字符串(C语言) 题目要求:如标题.例如,输入481,应输出字符串"483".n的位数不确定,可以是任意位数的整数. 思路: 设定函数function(i ...
- 7.17 递归法 数字转为字符串
//7.17 // 递归法将数字转为字符串 // 数字要考虑正负! void tran(int x) {if (x / 10)tran(x / 10);printf("%c", x ...
- 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和
注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...
- 2016校招腾讯研发岗笔试题---递归法求解格雷码
题目:一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码( Gray Code ).请编写一个函数,使用递归方法生成 N 位的格雷码. 测试输入输出如下 输入:1 输出:[ ...
- 面试题28:字符串全排列
字符串全排列是面试中常考的问题,一定要掌握 这题没写出来,思路就是把第一个字符和后面所有字符交换,然后递处理后面n-1个,最后需要在调用交换函数换回原始字符串 1 #include<iostre ...
- 2013蓝桥杯C++B:第39阶台阶(递归法);前缀判断
三.题目:第39阶台阶 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶. ...
最新文章
- Machine Learning - Andrew Ng on Coursera (Week 2)
- 利用Hadoop Streaming处理二进制格式文件
- CodeForces 416B
- vue.js实战——购物车练习(包含全选功能)
- MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
- repomd.xml错误14 not found
- c++中友元函数详解
- DIV+CSS—菜鸟分享学习心得!导航篇
- 大数据学习笔记25:MR案例——自定义输入输出格式处理个人成绩
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
- html制作炸金花,如何在微信小程序上制作炸金花?
- FPGA与ASIC及SOC的区别?ARM是什么
- 【R语言】预测模型最合适阈值Cutoff选取及其它指标计算
- seo和网站服务器有什么区别,SEO与竞价推广有什么不同?
- html打印页标题行,打印标题行的设置方法
- python许可证_一图看懂各种许可协议
- Android Studio安装遇到的问题(最全)
- 【VS】vs2012解决nuget下载太慢的问题
- 10kv开关柜价格_10kv开关柜价格一般多少
- python编写arcgis脚本教程_面向ArcGIS的Python脚本编程