递归生成char数组中所有字符(长度为k)的组合的字符串数组

时间:2019-03-02 15:36:00

标签: java arrays recursion

对于Java练习,我正在尝试编写一个类,该类在字符数组中生成所有字母组合,并将它们放入String数组中。 该对象应使用字符数组构建,并且应具有将int作为输入的方法。整数将确定组合应保留的时间。

例如,输入:

char[] charArray = { 'a', 'b' };
int k = 3;

输出:

[ "aaa", "aab", "aba", "abb", "baa", "bab", "bba", "bbb" ]

该方法应该是递归的,每次应使用k-1对其进行调用。

我尝试了一个简化版本,生成了一个带有所有下划线分隔的字符串,但是我没有得到想要的输出。

public String generate(int k) {
    if (k == 0) return "_";
    String s = "";
    for (char c : charArray) {
        s = s+c+generate(k-1);
    }
    return s;
}

我的输出是:

"aaa_b_ba_b_baa_b_ba_b_"

代替:

"aaa_aab_aba_abb_baa_bab_bba_bbb"

2 个答案:

答案 0 :(得分:1)

尝试类似的方法(使用Java 8):

public String generate(String accumulator, int k) {
    if (k == 0) return accumulator;
    return Arrays.stream(stringArray).map(s -> generate(accumulator + s, k - 1)).collect(Collectors.joining("_"));
}

我只需要将char的数组更改为String的数组:

String[] stringArray = new String[]{ "a", "b" };

然后调用方法generate("", 3)生成结果:

aaa_aab_aba_abb_baa_bab_bba_bbb

答案 1 :(得分:1)

您的方法还需要一个包含预值的参数。

您可以根据需要尝试以下代码段:

public static String generate(String prefix, int k) {
        String s = "";
        if (k == 0)
            return prefix + "_";

        for (char c : charArray) {
            String newPrefix = prefix + c;
            s = s + generate(newPrefix, k - 1); 
        }
        return s;
    }

此代码将生成"aaa_aab_aba_abb_baa_bab_bba_bbb_",因此您必须删除最后一个下划线。