假设我有字符串"Hey"
。我想确定此字符串中存在的所有字符组合尽可能快速。生成的算法应该生成:
H, e, y, He, ey, Hey
算法应该不生成字符串"Hy"
,因为不作为子字符串存在于字符串中。
答案 0 :(得分:3)
这些子字符串O(n^2)
长度为[1,n]
,因此生成所有的算法将为O(n^2) * O(n) = O(n^3)
:
(*)请参阅最后的Edit2 - 取决于字符串的实现 - 复杂程度可能从O(n^2)
到O(n^3)
伪代码:
result <- {} #result is a set if dupes should be terminated, otherwise - it is a multiset.
for i from 0 to s.length:
for j from i+1 to s.length:
result.add(s.substring(i,j))
return result
但是请注意,你可以做一些“作弊”,通过创建一个迭代器并动态生成子串,它应该看起来像这样[伪代码]:
class MyIterator:
String s
int i,j
MyIterator(String s):
this.s = s
i = 0
j = 0
next():
j = j + 1
if (j >= s.length):
i = i + 1
j = i + 1
if (i >= s.length):
throw exception
return s.substring(i,j)
请注意,创建迭代器是O(1)
,每次迭代都是O(n)
- 但要实际生成所有元素,您需要O(n^2)
个步骤,因此复杂性仍为O(n^3)
总的来说,但是减少了应用程序的延迟。
修改强>
我编辑了复杂性,声称它是O(n^2)
是错误的,复杂性是O(n^3)
,因为你需要生成可变长度的字符串,其中一些很长。至少有一半生成的子串长度为n/2
- 因此总复杂度为Theta(n^3)
<强> EDIT2:强>
在某些情况下,它实际上可以是O(n^2)
- 取决于字符串实现。例如,在java中 - 它使用单个char[]
,并且只与offset
和length
一起“播放” - 所以在java中 - 创建实际上是O(n^2)
,因为创建了子串是O(1)
在C中 - 它是O(n^3)
,因为每个子字符串都需要复制到不同的char[]
。
答案 1 :(得分:0)
检查php中n-gram的实现。
在您的示例字符串中:嘿
H,E,Y是unigrams
他,EY是双胞胎
HEY是一个三元组