[英]Recursion - Setting brackets to string characters
我的编程任务有问题。 我的工作是编写一个获取字符串并将其括起来的方法。 它应该以数组的形式返回。 例如:
String s = "ab";
那么数组必须是:
[ab, (a)b, ((a)(b)), a(b), (ab), (a)(b), ((a)b), (a(b))]
重要的是没有结果出现两次。 同样重要的是,不应有括号直接包含另一对括号,例如((a))b
或(((a)(b)))
。 如果它为空或为零,则结果也必须是一个空数组。 ()
是不允许的。 我只能使用 class String
的方法。 Class 英国脱欧包括一个名为 append 的方法。 使用这种方法,我可以 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));
}
}
}
由于Java 9你可以使用String.codePoints
方法得到一个stream超过字符,然后使用map
和reduce
的方法。
示例字符串:
String s = "ab";
首先将每个字母表示为这个字母的数组,这个字母用括号表示:
[a, (a)]
[b, (b)]
然后得到这些 arrays 的笛卡尔积:
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));
最终 output:
[ab, (ab), a(b), (a(b)), (a)b, ((a)b), (a)(b), ((a)(b))]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.