我正在尝试创建一个数据结构来保存所有可能的子字符串组合,这些组合加起来就是原始字符串。例如,如果字符串是"java"
,则有效结果将是"j", "ava"
、"ja", "v", "a"
,无效结果将是"ja", "a"
或"a", "jav"
。
我很容易就找到了所有可能的子串
String string = "java";
List<String> substrings = new ArrayList<>();
for( int c = 0 ; c < string.length() ; c++ )
{
for( int i = 1 ; i <= string.length() - c ; i++ )
{
String sub = string.substring(c, c+i);
substrings.add(sub);
}
}
System.out.println(substrings);
现在我试着构造一个只包含有效子字符串的结构。但是这并不容易。我陷入了一段非常丑陋的代码的迷雾中,摆弄着索引,没有接近完成的地方,很可能是完全走错了路。有什么提示吗?
7条答案
按热度按时间h4cxqtbf1#
这里有一个方法:
输出:
q9rjltbz2#
看起来这是一个问题,即找到字符串长度的compositions,然后用这些组合来生成子串,所以一个数n有2^n-1个组合,这对于长字符串来说可能有点耗时......
nfs0ujit3#
也许有人会喜欢另一种非递归的解决方案,并且不占用内存来保存列表:
输出:
它只是根据索引计算下一个组合。
yb3bgrhw4#
为了防止有人在Python中寻找相同的算法,下面是Python中的实现:
示例如何工作:
只需稍加修改,就可以按不同顺序生成合成:
它会给予你:
再加上一个小的附加功能,您可以只生成指定数量的拆分:
mpbci0fu5#
另一种递归解决方案只是将结果添加到列表中
k5ifujac6#
这个问题可以通过这个代码来解决。
[a、b、c、d、ab、bc、cd、da、abc、bcd、cda、dab、abcd、bcda、cdab、dabc]
nzkunb0c7#
你可以用下面的公式来计算。
这里我使用ABCD作为我的输入字符串。