字符串的所有子字符串和 'semi-substrings'

All substrings and 'semi-substrings' of a 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));

这将使我在集合中得到以下结果:

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

因此,除了所有子字符串之外,我还需要删除中间的一个或多个字符时的字符串(即通过删除 bdace)。

完成此任务最简单的方法是什么?

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

查看此解决方案。我的软件工程导师 class 不久前为我们提供了这个解决方案。我对它进行了一些编辑,以确保您获得带有 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. 将您的 inputString 更改为 char[]
  2. 对于输出:a,b,c,d,e 只需在简单的 for loop
  3. 中打印 char[i]
  4. 对于两个字母输出,如:ab、ac 等 - 像您一样循环,所以 char[i] + char [j] 将成为您的子字符串
  5. 对于三个字母输出 - 像步骤 3 一样循环执行,但在这种情况下,从 char[] 数组 char[i] and char[j] 中删除,这样您就可以得到正确顺序的字母
  6. 对于四个字母输出删除一个 char[i] 使用简单循环