String的所有子串和'semi-substrings'

时间:2017-10-16 12:39:38

标签: java string set substring partial

我知道我可以得到给定String的所有子串:

String inputString = "abcde";

java.util.Set<String> substrings = new java.util.TreeSet<>();
int strLength = inputString.length();
for(int i=0; i<strLength; i++)
  for(int j=0; j<=strLength-i; j++)
    substrings.add(inputString.substring(i, i+j));

这将在Set中获得以下结果:

a, ab, abc, abcd, abcde, b, bc, bcd, bcde, c, cd, cde, d, de, e, 

但是,我想以某种方式获得以下列表:

a, ab, abc, abcd, abcde, abce, abd, abde, abe, ac, acd, acde, ace, ad, ade, ae, b, bc, bcd, bcde, bce, bd, bde, be, c, cd, cde, ce, d, de, e

因此,除了所有子字符串之外,当您删除其中的一个或多个字符时我也想要字符串(例如ace删除bd)。

实现这一目标的最简单方法是什么?

注意:所有字符应保持相同的顺序,否则我会将字符串的所有排列与这些字符串的所有子字符串组合在一起。

2 个答案:

答案 0 :(得分:1)

检查此解决方案。我的软件工程课程的讲师不久前为我们提供了这个解决方案。我对它进行了一些编辑,以确保您获得了TreeSet的有序集。

public static Set<String> stringSubsets(String str) {
    if (str.isEmpty()) {
        return new TreeSet<>(Arrays.asList(""));
    } else {
        char currentChar = str.charAt(0);
        String rest = str.substring(1);

        Set<String> combinationsOfRest = stringSubsets(rest);
        Set<String> result = new TreeSet<>();

        result.addAll(combinationsOfRest);
        for (String c: combinationsOfRest)
            result.add(currentChar + c);

        return result;
    }
}

答案 1 :(得分:0)

  1. 将您的inputString更改为char[]
  2. 输出:a,b,c,d,e只需在简单的char[i]
  3. 中打印for loop
  4. 用于两个字母输出,如:ab,ac等。 - 像你一样循环循环,所以char[i] + char [j]将成为你的子串
  5. 对于三个字母输出 - 在循环中执行循环,如步骤3中所示,但在这种情况下,从char[]数组char[i] and char[j]中删除,以便按正确顺序获取字母
  6. 四个字母输出使用简单循环删除一个char[i]