全排列问题(第0届第1题)
2015-12-21 00:32
267 查看
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼[b]▼[/b]
样例输入1:abc,
样例输出1:abc acb bac bca cab cba
样例输入2:cab,
样例输出2:abc acb bac bca cab cba
样例输入3:abb,
样例输出3:abb bab bba
另外,全排列的一个重要思想是递归。要想计算abc的全排列,只需先让a为首,然后计算bc的全排列,再与a一起输出,然后让b为首,计算ac的全排列,最后让c为首,计算ab的全排列。每个字母为首完毕,都要恢复到对应的初始状态,以abc为例,它的调用状态如下:
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲[b]▲[/b]
题目要求
问题描述:输入一个可能重复的英文字符串(以逗号作为结束标记),按字典顺序无重复输出其所有可能的排列方式。样例输入1:abc,
样例输出1:abc acb bac bca cab cba
样例输入2:cab,
样例输出2:abc acb bac bca cab cba
样例输入3:abb,
样例输出3:abb bab bba
解决方案
这个问题属于全排列问题,而且需要解决两个问题:第一是按字典顺序输出,第二是无重复输出。为了保证字典顺序输出,需要对输入的字串先进行一次排序,以便于之后的操作。为了保证无重复输出,需要在输出时判断当前情形是否输出过,这一点在保证字典顺序的情况下很好判断。另外,全排列的一个重要思想是递归。要想计算abc的全排列,只需先让a为首,然后计算bc的全排列,再与a一起输出,然后让b为首,计算ac的全排列,最后让c为首,计算ab的全排列。每个字母为首完毕,都要恢复到对应的初始状态,以abc为例,它的调用状态如下:
源码示例
结果展示
小结
全排列,关键是先递归排列后面的,然后再排列前面的。注意for循环与递归的联合使用。▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲[b]▲[/b]
相关文章推荐
- Volley
- 基于行为命令队列的Behaviour系统设计
- 行为树结构(简易版)
- hdu5548
- ThinkPHP 3.2.3 中设置和使用 Session
- linux里面的特殊$变量
- Ubuntu语言无法切换中文问题
- Arcgis Server发布服务
- const 指针与指向const的指针
- 【Unity】游戏缩减压缩包大小(一)
- LeetCode 119:Pascal's Triangle II
- 行为树随笔
- One Month~
- linux下使用vi编辑器简单介绍
- java反射获得泛型参数GETGENERICSUPERCLASS()
- cout和printf
- cocos2d+sublime text2配置lua开发环境
- 10030---CSS 属性选择器
- 我的liunx开发环境的配置之路
- 2015-12-21,我在csdn的第一篇博客