字串的全排列(java)
阿新 • • 發佈:2019-02-12
差不多半個月沒寫部落格了,今天再寫一篇。
字串全排列相信大家都不陌生,對於我來說真的是寫了又忘,忘了又寫,所以決定寫成一篇部落格,廢話不多說下面我來分析問題:
問題描述:給定一個字串寫出它的全排列,例如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"); }