您将如何创建递归方法
getSubstrings("abc")
返回该字符串的所有可能子串的列表,例如
{ "a", "b", "c", "ab", "bc", "ac", "abc" }
答案 0 :(得分:1)
第一步是写下一个明确且可验证的函数规范,并可能避免给出与该规范相矛盾的示例输出。没有第一步,你显然无法继续。
答案 1 :(得分:1)
我看到你想要的是组合,而不是子串。以下是所有组合的代码。
递归地从第一个字符开始并添加到列表即a
,然后递归调用下一个字符并添加到列表ab
然后下一个abc
,现在不再有字符所以它回溯而不是添加b
它现在添加c
所以添加ac
然后相同的过程重复下一个字符b
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
System.out.println(combination("abc"));
}
public static List<String> combination(String str) {
List<String> list = new ArrayList<String>();
combination("", str, list);
return list;
}
public static void combination(String sub, String str, List<String> list) {
if (sub.length() != 0) list.add(sub);
for (int i = 0; i < str.length(); i++) {
combination(sub + str.charAt(i), str.substring(i + 1), list);
}
}
}
输出:[a, ab, abc, ac, b, bc, c]
答案 2 :(得分:0)
如果您不想使用递归算法(如@sujithvm提供的算法),您可以使用此迭代算法:
String str = "abc";
for (int i = 1; i < (1 << str.length()); i++) {
String comb = "";
for (int j = 0, k = 1; k <= i; j++, k <<= 1) {
if (i & k == 1) {
comb += str.charAt(j);
}
}
System.out.println(comb);
}
此方法首先生成str
的所有可能组合。这些组合表示为二进制数字序列,其中位置X处的数字0(分别为1)表示不包括(分别包括)位置X处的str
中的字符。例如,对于str = "abc"
,组合为001,010,011,100,101,110和111. 110表示字符 a 和 b 包括在内,而字符 c 则不包括在内。因此,110表示组合 ab 。