所有子和一个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
,通过删除b
和d
)。
什么是最简单的方法来完成这个?
注意:所有字符都应保持相同的顺序,否则我会将字符串的所有排列组合到这些字符串的所有子字符串中。
答
检查此解决方案。在我的软件工程课上,我的讲师早就给我们提供了这个解决方案。我编辑了一下,以确保你得到一个有序集合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
非常感谢!我会在一分钟后接受它作为答案。 –
答
- 更改
inputString
到char[]
- 输出:
a,b,c,d,e
只是打印char[i]
像一个简单for loop
- 两个字母输出:AB,AC等等 - 在像你这样的循环做循环没有,所以
char[i] + char [j]
是要成为你的子 - 三个字母输出 - do循环中像在步骤3中的循环,但在这种情况下,从
char[]
阵列char[i] and char[j]
删除,桑尼OU得到的字母按正确的顺序 - 四个字母输出使用简单的循环
删除一个
char[i]
你是什么意思与*“不过,我在下面的列表后,我代替” *? –@NikolasCharalambidis我会重写它,但我的意思是,这是我正在寻找的结果。我只是不知道如何完成这一点。 –