全排列问题(第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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值