题目:

  输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。




解决:

  简单起见,字符串中没有相同的字符。

  其实这是个递归的过程:对于字符串str,先分别逮住其中的每一个,如s,把它从str中踢开,成了 s + tr(下一次踢开t变为 t + sr),然后对于剩下来的,再从剩下的再次分别踢开一个加到左边的后面(假想被踢开的都在左边,剩下的都在右边哈),一直如此,直至右边都踢光了。算法如下:  

void show(strL, strR)
{if (strR不是空字符串){for (对于strR中的每一个字符){把这个字符踢到strL的后面递归show()}} else{显示左边的字符串}
}

  代码如下:

 1 #include <iostream>
 2 #include <string>
 3
 4 using std::cout;
 5 using std::endl;
 6 using std::cin;
 7 using std::string;
 8
 9 //在这个过程中,把字符串分为左右两半,左边的字符已经固定,右边的可以组合出各种情况
10 //最后把左边固定的和右边各种情况一一连接,就是完整的各种字符串了
11 void show(string strL, string strR)
12 {
13     if (!strR.empty())        //右边的非空
14     {
15         for (int i = 0; i < strR.size(); i++)        //对于每种情况
16         {
17             //注意要用左右字符串的副本
18             string tempL = strL;
19             string tempR = strR;
20
21             tempL.append(1, strR[i]);        //把那个字符添加到左边字符串的后面
22             tempR.erase(i, 1);        //右边的字符串中删除那个
23             show(tempL, tempR);        //递归进行
24         }
25     }
26     else
27     {
28         cout << strL << endl;
29     }
30 }
31
32 int main(void)
33 {
34     string left;
35     string test("abcde");
36
37     show(left, test);
38     cout << "------------------------------------\n" << left << endl << test;
39
40     cin.get();
41 }

  结果:




总结:

  递归的思想。

  其实可以看做一棵树,从根节点开始分叉,每一个分叉是一种情况,最终到叶节点的高度为n,n为字符串长度,每个叶节点是一种情况。

转载于:https://www.cnblogs.com/jiayith/p/3921696.html

打印给定字符串中字符的所有排列相关推荐

  1. c语言输入一段字符,C语言实现输入一个字符串后打印出该字符串中字符的所有排列...

    本文实例讲述了C语言实现输入一个字符串后打印出该字符串中字符的所有排列的方法,属于数学里的排列问题.是一个很实用的算法技巧.分享给大家供大家参考.具体实现方法如下: 例如输入字符串abc,则输出由字符 ...

  2. 【20190405】算法-输入一个字符串,按字典序打印出该字符串中字符的所有排列

    方法一:利用递归 利用递归求全排列的过程真的很难理解,先把代码贴上来吧 function Permutation(str) {// write code hereif(!str){return str ...

  3. 本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符

    本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符 函数接口定义: char *match( char *s, c ...

  4. 在控制台中录入一个字符串 , 打印这个字符串中的字符以及出现的次数(Python)

    #练习2:在控制台中录入一个字符串 # 打印这个字符串中的字符以及出现的次数. # abcdbcdb # a字符1次 # b 3 # c 2 # d 2 str_input = "abcdb ...

  5. 统计给定字符串中各字符的个数

    题目要求:统计一个给定字符串中指定的字符出现的次数具体的输入输出格式规定如下: 输入格式:测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过 5的字符串,第2行为一个长度不超过80 ...

  6. 本题要求编写程序,从给定字符串中查找某指定的字符。

    本题要求编写程序,从给定字符串中查找某指定的字符. 输入格式: 输入的第一行是一个待查找的字符.第二行是一个以回车结束的非空字符串(不超过80个字符). 输出格式: 如果找到,在一行内按照格式&quo ...

  7. 本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

    7-2 统计字符出现次数 输入样例: 输入第一行给出一个以回车结束的字符串(少于80个字符):第二行输入一个字符. 输出样例: 在一行中输出给定字符在给定字符串中出现的次数. 输入样例: progra ...

  8. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量

    字符串的回文子序列个数 Problem statement: 问题陈述: Given a string you have to count the total number of palindromi ...

  9. 每天一道LeetCode-----寻找给定字符串中重复出现的子串

    Repeated DNA Sequences 原题链接Repeated DNA Sequences 在给定字符串中寻找重复出现的序列,每个序列长度为10 可以采用unordered_map记录每个序列 ...

最新文章

  1. 可视化的Redis数据库管理工具redis-desktop-manager的初步使用(图文详解)
  2. tcpdump源码分析——抓包原理
  3. 设计模式初探之模板方法(Template Method)
  4. Git忽略规则.gitignore梳理
  5. 匿名内部类和匿名类_匿名schanonymous
  6. 前端学习(3027):vue+element今日头条管理-关于图标的处理
  7. OpenCV图像或视频显示在VC对话框中的方法
  8. mac 黑窗口连接mysql_mac上终端起动MySQL的方法
  9. ubuntu从命令打开终端
  10. 孙鑫VC学习笔记:第十五讲 (一) 进程和线程基本概念
  11. E-Prime 软件中常用的 inline 语句
  12. css ol 序列样式:数字带圆圈、括号
  13. 【Linux】一步一步学Linux——hostid命令(246)
  14. 数据挖掘基础之数据库
  15. Activiti7工作流引擎介绍
  16. 计算机硬盘多少克,人的大脑记忆能力相当于电脑多少G的硬盘?真相出乎你意料!...
  17. 一个屌丝程序猿的人生(八十)
  18. Python测试题(绘制柱状图、画出sin函数图像、散点图、pandas实现列表)
  19. VBA 2000年之后活期存款利息计算
  20. 2014中国计量学院matlab考试卷,中国计量学院学习心得

热门文章

  1. cocos2dx event call stack
  2. 初学git:用git bash往github push代码
  3. QTP测试之With秒用
  4. QQ圈子:从哪里来,到哪里去
  5. Android 开源库获取途径整理
  6. scratch学习_学习scratch编程能学到什么?对孩子有帮助吗?
  7. 架构师之路 — 数据库设计 — 关系型数据库理论
  8. Go 语言编程 — go mod 依赖包管理
  9. Python Module_Socket_网络编程
  10. CoordinatorLayout 使用及源码解析