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

给一个字符串,比如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<String> list=permutation(sc.next());
			System.out.println(list);
		}
	}
	
	private static LinkedList<String> permutation(String str)
	{
		LinkedList<String> permuList=new LinkedList<String>();
		
		//递归出口,当只有字符串只包含一个字符的时候
		if(str.length()<=1)
		{
			permuList.add(str);
			return permuList;
		}
		
		for(int i=0;i<str.length();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<String> newPermuList=permutation(newStr);
			for(int j=0;j<newPermuList.size();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


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值