题解-全排列

本文介绍了如何解决全排列问题,给出了详细的解题思路和C++代码实现。通过递归思想,按照字典序逐层遍历字符串,生成所有可能的排列组合。
摘要由CSDN通过智能技术生成

题目

描述

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’a’ < ‘b’ < … < ‘y’ < ‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S = s1s2…sk , T = t1t2…tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。

样例输入
abc
样例输出
abc
acb
bac
bca
cab
cba

解题思路

按照字典序输出某个字符串的全部排列其实带有很深的递归思想。
以题目中的abc为例:

  1. 对于第一位(从左到右)字母来说,它就是abc字符串中字母的字典序排列;
  2. 对于第二位字母来说,就是将第一位的字母除去后的剩下的字母的字典序排列。
  3. 对于第三位字母来说,就是除去前两位字母后的字典序排列。当然,由于本例中只有三个字母,因此最后一位字母在前两位确定之后也就确定了,因此不符合这个条件。

不难看出,除最后一位之外,之前的每一位在纵向上都是排除了其前面位字母后的字典序排列。因此我们就得到了基本的解题思路:
根据字母的位数不同分层,每层按照字典序进行进行一次遍历。每往下一层就去除前一位的字母。比如在本例中第一层遍历abc,第二层遍历bc,第三层直接输出。同时使用vector记录每一层所遍历到的那一个字母,以便输出。

代码

代码语言使用C++,使用了list来记录所要遍历的字母。

#include<iostream>
#include<string>
#include<list>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值