字串全排列演算法java實現
阿新 • • 發佈:2019-01-25
字串的全排列 遞迴方法實現
要實現字串全排列 我覺得像是一種分治法的感覺。比如AB只有兩種 :
AB BA
到了ABC時可以抽出A 只看BC的話就是兩種,然後BC全排列之後放在A後面。
隨後取出B對AC全排列放在B後面
以此類推,此演算法非常精美 但是位數多了全排列數量會呈指數式增長。
程式碼如下:
import java.util.ArrayList; import java.util.List; public class StringTest { public static void main(String[] args) { List<String> ls = permutations("ABCD"); for(String s:ls){ System.out.println(s); } } public static List<String> permutations(String str){ //每一組排列都被儲存在字串列表中 List result = new ArrayList<>(); //基本情況 if(str.length()==1){ result.add(str); }else{ //對字串每一個字元執行操作 for(int i=0;i<str.length();i++){ //對EveryThingElse返回的字串組合進行操作 for(String p:permutations(EverythingElse(str, i))){ //插入當前字元到排列中 result.add(str.charAt(i)+p); } } } return result; } private static String EverythingElse(String str,int IndexToIngore){ StringBuilder result = new StringBuilder(); for(int i=0;i<str.length();i++){ if(IndexToIngore!=i){ result.append(str.charAt(i)); } } return result.toString(); } }
但是這個程式碼有個明顯的缺陷請你思考一下
就是有重複字元的話會輸出重複的排列 比如AAB的時候就會有重複
所以簡單辦法就是使用set資料結構進行字串的儲存 他會自動去重,十分好用
import java.util.HashSet; import java.util.List; import java.util.Set; public class StringTest { public static void main(String[] args) { Set<String> set = permutations("ABC"); for(String s:set){ System.out.println(s); } } public static Set<String> permutations(String str){ //每一組排列都被儲存在字串列表中 Set result = new HashSet<>(); //基本情況 if(str.length()==1){ result.add(str); }else{ //對字串每一個字元執行操作 for(int i=0;i<str.length();i++){ //對EveryThingElse返回的字串組合進行操作 for(String p:permutations(EverythingElse(str, i))){ //插入當前字元到排列中 result.add(str.charAt(i)+p); } } } return result; } private static String EverythingElse(String str,int IndexToIngore){ StringBuilder result = new StringBuilder(); for(int i=0;i<str.length();i++){ if(IndexToIngore!=i){ result.append(str.charAt(i)); } } return result.toString(); } }
美滋滋