Java中的递归和子串

时间:2014-06-20 10:12:57

标签: java string recursion substring

您将如何创建递归方法

getSubstrings("abc")

返回该字符串的所有可能子串的列表,例如

{ "a", "b", "c", "ab", "bc", "ac", "abc" }

3 个答案:

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