1. 程式人生 > >字串的全排列(java)

字串的全排列(java)

       差不多半個月沒寫部落格了,今天再寫一篇。

       字串全排列相信大家都不陌生,對於我來說真的是寫了又忘,忘了又寫,所以決定寫成一篇部落格,廢話不多說下面我來分析問題:

問題描述:給定一個字串寫出它的全排列,例如ab,全排列是ab,ba,而abc的全排列abc,acb,bac,bca,cab,cba。

解題思路:我們以具體例子分析,假如abc,如上所示,它的全排列是不是就是把字串中每一個字元,放在第一位,然後再對剩下的字串做全排列,如把a放在第一位,剩下bc

全排列是bc,cb,組合起來就是abc,acb,那麼把b放在第一位,剩下字串的排列是ac,ca,組合起來就是,bac,bca。那麼把字串中所有的字元都放在第一位一次,等這些過程全部做完,那麼就是一個字串的全排列。所以這就是一個遞迴的思路,把字串分為兩部分,第一部分是取出的字元,第二部分是剩下的字元組成的字串,把第一部分放在第一位,把第二部分的全排列放在第二位。那麼怎麼把第一部分和第二部分組合起來才是關鍵,因為第一部分,只是一個字元,第二部分是全排列,是好幾個字串,我的思路是一種字元積累的思路,我們把第一部分積累起來成一個字串,開始的時候這個字串是一個空字串,當我們取出一個字元,把這個字元新增到這個字串的末尾,然後形成一個新的字串,這就把第一個字元積累起來了,然後把這個積累起來的字串當做一個引數,傳遞給第二部分要做全排列的函式中,第二部分在做全排列的時候,還是把取出的字元加到哪個積累字串的後面,那麼第二部分越拆越短,知道不能拆了,這時候這個積累字串其實就是全排列中的一個字串,然後將這個積累字串輸出就好。

下面是我的程式碼:

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Test {
    public static void getFull(String str){
    	if(str==null){
    		System.out.println("null");
    	}else{
    	    getFull(str,"",str.length(),new HashSet<String>());
    	}
    }
	private static void getFull(String str,String has,int length,Set<String> set){
			for(int i=0;i<str.length();i++){
				StringBuilder sb=new StringBuilder();
				char single=str.charAt(i);
				String front="";
				String behind="";
				if(i==0){
					front="";
					behind=str.substring(1);
				}else if(i==str.length()-1){
					front=str.substring(0, str.length()-1);
					behind="";
				}else{
					front=str.substring(0, i);
					behind=str.substring(i+1);
				}
				sb.append(front);
				sb.append(behind);
				String temp=has+String.valueOf(single);
				if(temp.length()==length){
					if(!set.contains(temp)){
						 set.add(temp);
				  	     System.out.println(temp);
					}
				}
				getFull(sb.toString(), temp,length,set);
			}
	}
	public static void main(String[] args) {
		getFull("abc");
		
	}