【问题标题】:Recursion - Setting brackets to string characters递归 - 将括号设置为字符串字符
【发布时间】:2021-07-29 18:35:29
【问题描述】:

我的编程任务有问题。我的工作是编写一个获取字符串并将其括起来的方法。它应该以数组的形式返回。例如:

String s = "ab";

那么数组必须是:

[ab, (a)b, ((a)(b)), a(b), (ab), (a)(b), ((a)b), (a(b))]

重要的是没有结果出现两次。同样重要的是,不应有括号直接将另一对括号括起来,例如((a))b(((a)(b)))。如果它为空或为零,则结果也必须是一个空数组。不允许使用()。我只能使用String 类的方法。类Brexit 包括一个称为append 的方法。使用这种方法,我可以将字符串附加到数组的末尾。现在这是我到目前为止的代码,但我不知道如何继续。

public class Brackets {
    public static String[] bracket(BrExIt b, String s) {
        String[] array = new String[]{};
        if (s == null || s == "") {
            return array;
        }
        if (s.length() == 1) {
            array = b.append(array, s);
            array = b.append(array, "(" + s + ")");
            return array;
        } else {
            int a = 0;
            return bracket(b, s.substring(a + 1, s.length() - 1));
        }
    }
}

【问题讨论】:

  • 您能否更详细地解释所需的包围策略。该模式对于长度为 2 的输入是明确的,但对于较长的字符串则不是。例如,“(ab)c”是给定“abc”的必需输出吗?
  • 是的,还有(abc),(a)bc,((ab)c)......

标签: java arrays string recursion brackets


【解决方案1】:

Java 9 开始,您可以使用String.codePoints 方法获取字符上的,然后使用mapreduce 方法。

示例字符串:

String s = "ab";

首先将每个字母表示为这个字母的数组,这个字母用括号表示:

[a, (a)]
[b, (b)]

然后得到这些数组的笛卡尔积

ab
a(b)
(a)b
(a)(b)

如果你想得到更多的括号,重复第一个操作:

[ab, (ab)]
[a(b), (a(b))]
[(a)b, ((a)b)]
[(a)(b), ((a)(b))]

Java 代码:

String s = "ab";

String[] array = s
        // stream over the characters of the string
        .codePoints()
        // Stream<String>
        .mapToObj(Character::toString)
        // represent each letter as an array of
        // this letter and this letter with brackets
        .map(str -> new String[]{str, "(" + str + ")"})
        // intermediate output
        .peek(arr -> System.out.println(Arrays.toString(arr)))
        // stream of arrays to a single array
        .reduce((arr1, arr2) -> Arrays.stream(arr1)
                .flatMap(str1 -> Arrays.stream(arr2)
                        .map(str2 -> str1 + str2))
                .toArray(String[]::new))
        // Stream<String[]>
        .stream()
        // Stream<String>
        .flatMap(Arrays::stream)
        // intermediate output
        .peek(System.out::println)
        // represent each string as an array of
        // this string and this string with brackets
        .map(str -> new String[]{str, "(" + str + ")"})
        // intermediate output
        .peek(arr -> System.out.println(Arrays.toString(arr)))
        // Stream<String>
        .flatMap(Arrays::stream)
        .toArray(String[]::new);

// final output
System.out.println(Arrays.toString(array));

最终输出:

[ab, (ab), a(b), (a(b)), (a)b, ((a)b), (a)(b), ((a)(b))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 2018-12-13
    • 2017-03-21
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2013-04-06
    • 2017-10-28
    相关资源
    最近更新 更多