2013-05-15 32 views
0

我想獲得一個返回輸入字符串的所有排列的方法。我搜查了互聯網,發現其中大部分與Robert Sedgewick的代碼相似:http://introcs.cs.princeton.edu/java/23recursion/Permutations.java.html我得到的函數返回排列數組的難題

但是,我想返回排列,而不是打印它們。 羅伯特·塞奇威克的代碼被複制在這裏:

public class Permutations { 
    // print N! permutation of the characters of the string s (in order) 
    public static void perm1(String s) { perm1("", s); } 
    private static void perm1(String prefix, String s) { 
     int N = s.length(); 
     if (N == 0) System.out.println(prefix); 
     else { 
      for (int i = 0; i < N; i++) 
       perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N)); 
     } 
    } 
    public static void main(String[] args) { 
     perm1("abcd"); 
    } 
} 

而且通過自己從羅伯特·塞奇威克的重新編寫代碼如下:

import java.util.ArrayList; 

public class Test { 
    public static ArrayList<String> permute(String prefix, String s){ 
     int len = s.length(); 
     ArrayList<String> list = new ArrayList<String>(); 
     if(s.length() == 0) 
      list.add(prefix); 
     else 
      for(int i = 0; i < len; i++) 
       permute(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len)); 
     return list; 
    } 
    public static void main(String[] args) { 
     String str = "abcd"; 
     ArrayList<String> array = permute("", str); 
     System.out.print(array.size()); 
    } 
} 

但我的代碼不返回排列。它什麼都不返回。我不知道爲什麼。誰能幫我?

回答

2

您需要添加該置換方法到ArrayList結果:

import java.util.ArrayList; 

public class Test { 
    public static ArrayList<String> permute(String prefix, String s){ 
     int len = s.length(); 
     ArrayList<String> list = new ArrayList<String>(); 
     if(s.length() == 0) 
      list.add(prefix); 
     else 
      for(int i = 0; i < len; i++) 
       list.addAll(permute(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len))); 
     return list; 
    } 
    public static void main(String[] args) { 
     String str = "abcd"; 
     ArrayList<String> array = permute("", str); 
     System.out.print(array.size()); 
    } 
} 
+0

+1因爲它解決了OP的問題,以最小的變化,但我還是建議[Markus的答案]( http://stackoverflow.com/a/16557660/1711796),因爲它不在每一步連接'ArrayList',所以效率更高。 – Dukeling

+0

@Dukeling - 我同意,但我試着記住,這不是http://codereview.stackexchange.com/,我只是試圖顯示他出錯的地方。 – Craig

+1

而這正是你應該做的,但這樣做有效率是解決問題的下一步(即使不是必需的) - 我總是嘗試比較解決方案的效率,並嘗試在我自己和其他人的答案中提及更有效的解決方案(或者以另一個答案的鏈接的形式,解釋或代碼)。請記住,超越是可接受的答案與好的/好的答案之間的區別。馬庫斯的答案是一個更好的**解決方案**,但你的答案更好**。 – Dukeling

2
import java.util.ArrayList; 

public class Test { 

    /** Return a list of all the permutations of the given string. */ 
    public static ArrayList<String> permute(String s){ 
     ArrayList<String> accum = new ArrayList<String>(); 
     permute(accum, "", s); 
     return accum; 
    } 

    /** 
    * Private helper method to do the actual work. 
    * 
    * @param accum Accumulator of the results. 
    * @param prefix The current prefix. 
    * @param s The remaining string to permute. 
    */ 
    private static void permute(ArrayList<String> accum, String prefix, String s){ 
     int len = s.length(); 
     if(s.length() == 0) 
      accum.add(prefix); 
     else 
      for(int i = 0; i < len; i++) 
       permute(accum, prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len)); 
    } 

    public static void main(String[] args) { 
     String str = "abcd"; 
     ArrayList<String> array = permute(str); 
     System.out.print(array.size()); 
    } 
}