字符串-全排列算法

全排列算法

递归的思路

四个特性:

  1. 终止条件,否则陷入死循环
  2. 子问题规模比原问题小
  3. 子问题可以通过递归再次求解
  4. 子问题的解应该能组合成整个问题的解

全排列的过程:
对于字符串abc

  1. 首先固定字符a,得到后面两个字符bc的全排列;
  2. 轮到字符a与a后面的第一个字符即字符b交换位置,得到bac,对于后面两个字符全排列;
  3. 轮到字符a与a后面的第二个字符即字符c交换位置,但是此时在把字符c与第一个位置的字符进行交换前,要先把b和a交换回来,然后再拿字符c和字符a进行交换得到cba,再次固定字符c,对ba进行全排列;
  4. 已经知道怎么求三个字符串的排序,那么固定一个字符求另外两个字符的排序就是递归

去掉重复的全排列

由于全排列就是从第一个数字起,每个数分别与它后面的数字交换,我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这两个数就不交换了。例如abb,第一个数与后面两个数交换得bab,bba。然后abb中第二个数和第三个数相同,就不用交换了。但是对bab,第二个数和第三个数不同,则需要交换,得到bba。由于这里的bba和开始第一个数与第三个数交换的结果相同了,因此这个方法不行。

换种思维,对abb,第一个数a与第二个数b交换得到bab,然后考虑第一个数与第三个数交换,此时由于第三个数等于第二个数,所以第一个数就不再用与第三个数交换了。再考虑bab,它的第二个数与第三个数交换可以解决bba。此时全排列生成完毕!

去重的规则

去重的全排列就是从第一个数字起,每个数分别与它后面非重复出现的数字交换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值