【题目17】字符串的“无重复”全排列非递归算法

转载自:http://blog.csdn.net/roynee/archive/2009/06/28/4304796.aspx

 

[问题描述]: 输出字符串的所有全排列,要求无重复字符串出现


[问题解决]:改算法的思想是从字符串排列的最小字符串出发,找到小一个比该字符串大的数据。

             先对字符串排序,得到最小的排列串,然后

             从字符串尾部开始找第一个string[frontPos]<string[frontPos+1]的字符,定位forontPos

             然后从字符串的尾部开始找第一个比string[frontPos]大的字符string[tailPos],定位tailPos

             交换string[frontPos]和string[endPos], 然后 将string[frontPos+1]到string[len-1]的所有字符反序

             即得下一个字符(较前一个字符串大)

             如果得到的是最大的,即找不到比该字符串更到的字符串,该字符串一定是逆序排列的最大字符串

该算法,避免了重复字符串出现的问题。是个比较好的非常不错的典型算法,有那么丁点快排的味道。

递归的算法,可能处理重复的问题比较麻烦,如果不用STL的SET。

 

 

 

PS: 还有一种递归方式处理的,不过这个简单的递归只能处理所有字符都不同的

全排列,如果有两个字符相同的话,得出来的结果就不正确了。

原理:

E = {e1, e2, e3...en}n个元素的集合

Perm(X)表示集合X中元素的排列方式

ei.Perm(X)表示Perm(X)的每个排列方式的前面加上ei以后得到的排列方式

eg: E={a,b,c}, E1 = {b,c} Perm(E1) = {bc,cb}

e1.Perm(E1) = {abc,acb}

 

当n = 1时,只有一个元素,只能产生一种排列 Perm(E) = {e}

当n > 1时,

Perm(E) = e1.Perm(E1) + e2.Perm(E2)+...+en.Perm(En)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值