使用Java中的ArrayList对String及其子字符串进行排列

时间:2017-04-16 10:55:01

标签: java string permutation

我被要求编写一个程序,使用ArrayList查找String及其Sub-Strings的排列。我提出了一个解决方案,但它没有显示所需的输出。所以,如果有人能在这方面给我一点启发,我将不胜感激。

问题如下:

  

计算字符串及其子字符串的所有排列。例如,给定一个字符串S,例如" abc",它应该输出一个字符串列表/数组retlist [a,b,c,ab,ba,ac,ca,bc,cb,abc,acb ,bac,bca,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;
    }
}

我现在用上面的代码得到了结果:

  

[c] [b] [c,b] [c] [a] [c,a] [b] [a] [b,a] [c,b,c,a,b,a] < / p>

由于

1 个答案:

答案 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;
}}