所有子和一个String

问题描述:

我知道我能得到一个给定的字符串的所有子像这样的“半子”:所有子和一个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 

因此,除了所有的子串,我还希望字符串,当你删除一个或多个字符之间(即ace,通过删除bd)。

什么是最简单的方法来完成这个?

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

+0

删除一个char[i]你是什么意思与*“不过,我在下面的列表后,我代替” *? –

+0

@NikolasCharalambidis我会重写它,但我的意思是,这是我正在寻找的结果。我只是不知道如何完成这一点。 –

检查此解决方案。在我的软件工程课上,我的讲师早就给我们提供了这个解决方案。我编辑了一下,以确保你得到一个有序集合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; 
    } 
} 
+0

非常感谢!我会在一分钟后接受它作为答案。 –

  1. 更改inputStringchar[]
  2. 输出:a,b,c,d,e只是打印char[i]像一个简单for loop
  3. 两个字母输出:AB,AC等等 - 在像你这样的循环做循环没有,所以char[i] + char [j]是要成为你的子
  4. 三个字母输出 - do循环中像在步骤3中的循环,但在这种情况下,从char[]阵列char[i] and char[j]删除,桑尼OU得到的字母按正确的顺序
  5. 四个字母输出使用简单的循环