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