給定一個字符串,找出其所有不重複的排列組合

給一個字符串,比如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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章