我知道我可以得到给定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
删除b
和d
)。
实现这一目标的最简单方法是什么?
注意:所有字符应保持相同的顺序,否则我会将字符串的所有排列与这些字符串的所有子字符串组合在一起。
答案 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)
inputString
更改为char[]
a,b,c,d,e
只需在简单的char[i]
for loop
char[i] + char [j]
将成为你的子串char[]
数组char[i] and char[j]
中删除,以便按正确顺序获取字母char[i]