php 不重复字符串所有排列结果,给定一个字符串,找出其所有不重复的排列组合...

给一个字符串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出来。

解题思路:

对于一个n 位的字符串来讲,它是n-1位字符串的排列 加上 没有在 n -1 位字符串里 那个字符 的排列。

比如:

对于字符串ABC来讲,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。

而BC的排列是 B + C 的排列 加上 C + B 的排列。所以,对一个字符串,我们从中去一个值,然后求剩余部分的排列,然后把它们再组合在一起。代码如下:

package permutation;

import java.util.LinkedList;

import java.util.Scanner;

/**

* 排列组合一个字符串

* 给一个字符串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出来。

* 解题思路:

* 对于一个n 位的字符串来讲,它是n-1位字符串的排列 加上 没有在 n -1 位字符串里 那个字符 的排列。

* 比如:

* 对于字符串ABC来讲,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。

* 而BC的排列是 B + C 的排列 加上 C + B 的排列。

* 所以,对一个字符串,我们从中去一个值,然后求剩余部分的排列,然后把它们再组合在一起。

* @author Administrator

*

*/

public class PermutationString

{

public static void main(String[] args)

{

Scanner sc=new Scanner(System.in);

while(sc.hasNext())

{

LinkedList list=permutation(sc.next());

System.out.println(list);

}

}

private static LinkedList permutation(String str)

{

LinkedList permuList=new LinkedList();

//递归出口,当只有字符串只包含一个字符的时候

if(str.length()<=1)

{

permuList.add(str);

return permuList;

}

for(int i=0;i

{

char ch=str.charAt(i);//当前在第一位的字符

//相邻字符相同的情况下,会出现一样的排列组合

//例如 "AABC",当i=0时,当前字符'A',子字符串为"ABC"

//当i=1时,当前字符为'A',子字符串为"ABC",会得到一样的结果

if(i>0&&ch==str.charAt(i-1))

continue;

//接下来获取不包含该字符的n-1位字符构成的字符串

String newStr=getSubString(str,i);

//递归调用,直到newStr中只包含一个字符时

LinkedList newPermuList=permutation(newStr);

for(int j=0;j

{

permuList.add(ch+newPermuList.get(j));

}

}

return permuList;

}

/**

* 获取不包含当前字符的子字符串

* 如"ABC",当前字符为'A',则获取字符串"BC"

* @param str 当前字符串

* @param i 当前字符的索引位置

* @return

*/

private static String getSubString(String str,int i)

{

//当前字符(ch)位置在str的第一位时

if(i==0)

return str.substring(1,str.length());

//当前字符(ch)位置在str的最后一位时

if(i==str.length()-1)

return str.substring(0,str.length()-1);

return str.substring(0,i)+str.substring(i+1,str.length());

}

}

参考文章:http://blog.csdn.net/beiyeqingteng/article/details/7051942

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值