2017-04-16 60 views
0

我被要求編寫一個程序來查找使用ArrayList的字符串及其子字符串的排列組合。我想出了一個解決方案,但它沒有顯示所需的輸出。所以,如果有人能夠對我進行一點啓發,我將不勝感激。在Java中使用ArrayList的字符串及其子字符串的排列

的問題如下:

要計算一個字符串的所有排列和它的子串。例如,給定一個字符串S,例如「abc」,它應該輸出字符串列表/數組, cab,cba]。你的代碼應該把S作爲輸入,併爲排列列表產生retlist。除了可以運行的代碼之外,請優化代碼以提高速度和內存的效率(我們將測試大型字符串,並且速度越快越好)。

正如在問題所述,重排列 「ABC」 的字符串的情況下,它應該打印如下結果:

[A,B,C,AB,BA,AC,CA, BC,CB,ABC,ACB,BAC,BCA,CAB,CBA]

我想出迄今:

import java.util.ArrayList; 
import java.util.List; 

public class Permutation { 

    public static void main(String[] args) { 
     enumerateSubString("abc"); 
    } 

    public static List<String> enumerateSubString(String S_input) { 
     ArrayList<String> retlist = new ArrayList<String>(); 

     int n = S_input.length(); 

     if (n == 1) { 
      retlist.add(S_input); 
     } else { 
      for (int i = 0; i < n; i++) { 
       retlist.addAll(enumerateSubString(S_input.substring(0, i) + S_input.substring(i + 1, n))); 
      } 
     } 

     System.out.print(retlist); 
     return retlist; 
    } 
} 

的,我是越來越現在與T結果他以上代碼:

[c] [b] [c,b] [c] [a] [c,a] [b] [a,b,c] A,b,A]

感謝

+0

產生'ArrayList'的順序是否重要? –

+0

是的......輸出應該與預期結果完全一致。 –

+0

噢,好的。我可以編寫一個給出所有排列順序的代碼片段,但順序不會像你提到的那樣相同。 –

回答

0

添加具有遺傳算法另一個答案。這將提供所有順序。希望這個解決的目的

public class Test { 

public static void main(String[] args) { 

    String s = "abc"; 

    Map<Integer, List<String>> map = new HashMap<>(); 

    List<String> strArray = new ArrayList<String>(Arrays.asList(s.split(""))); 
    map.put(1, strArray); 

    if (strArray.size() > 1) { 
     new Test().enumerateSubString(strArray.size(), map); 
    } 
    System.out.println(map.values()); 
} 

public void enumerateSubString(int n, Map<Integer, List<String>> map) { 

    if (!map.containsKey(n)) { 
     map.put(n, new ArrayList<>()); 
    } 

    if (n == 2) { 
     // List of string with each having 1 character 
     List<String> list_1 = map.get(1); 
     // List of string which each having 2 characters 
     List<String> list_2 = new ArrayList<>(); 
     for (int i = 0; i < list_1.size(); i++) { 
      for (int j = i + 1; j < list_1.size(); j++) { 
       list_2.add(list_1.get(i) + list_1.get(j)); 
       list_2.add(swap(list_1.get(i) + list_1.get(j))); 
      } 
     } 
     // Map list_2 to key 2 
     map.put(n, list_2); 
    } else { 
     // Recursive function 
     enumerateSubString(n - 1, map); 
     // List of string with each having n-1 characters 
     List<String> list = map.get(n - 1); 
     // List of string with each having n characters 
     List<String> list_n = map.get(n); 
     // Add each character to list of n-1 to get n charater string list 
     for (String l1 : map.get(1)) { 
      for (String l : list) { 
       // this condition is to avoid repetation of charaters n 
       // String 
       if (l.indexOf(l1) < 0) { 
        list_n.add(l1 + l); 
       } 
      } 
     } 
    } 
} 

// Function to swap characters 
private String swap(String str) { 
    String s1 = str.substring(1) + str.substring(0, 1); 
    return s1; 
}}