NOIP学习之递归:188.全排列

本文介绍了如何使用递归方法解决全排列问题。以字符串'abc'为例,详细阐述了递归调用的过程,从输出字符串的初始化、字符回溯到递归排列的逻辑,展示了如何通过递归生成所有可能的排列顺序。
摘要由CSDN通过智能技术生成

测试链接
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有’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
解题思路:
1.这道全排列题特别好去理解递归调用,也就是递和归2条路径,以abc为例,首先是将输入字符串和输出字符串做分离,我觉得不用字符交换更利于理解这道题,也就是说输出字符的字母顺序始终变化,而输入字符保持不变;
2.先输出abc,将被递归进的2个b和c回溯,a位置不动,根据返回顺序,有的像堆栈,先进后出c和b进行交换,再进行回溯,这时候回溯包括第一个字符a
3.这时候再对a下面字符进行排列,也就是b,而b的位置要放到第一个字符,a经过递归放在第二个字符位置,输出bac;
4.再进行回溯,对a和c进行排列,输出bca;
5,在进行回溯,输出cab,再回溯,
6,输出cba;
此题关键是要锁定首字符,对其他字符进行排序,而首字符是再不断变化,但位置不变,定在第一个位置,而其他字符排列就正好使用递归去解决,也就是递归思想,f(n)可以用f(n-1)去实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值