全排列问题(第0届第1题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列问题(第0届第1题)相关的知识,希望对你有一定的参考价值。

题目要求

       问题描述:输入一个可能重复的英文字符串(以逗号作为结束标记),按字典顺序无重复输出其所有可能的排列方式。

       样例输入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循环与递归的联合使用。

 

以上是关于全排列问题(第0届第1题)的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(第0届第2题)

#yyds干货盘点# leetcode算法题:全排列

精选力扣500题 第28题 LeetCode 46. 全排列c++ / java 详细题解

《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++

顺序右移数组元素(第0届第5题)

全排列问题