确定现有字符串的所有子字符串的最快方法

时间:2012-03-20 17:25:13

标签: php string algorithm permutation combinations

假设我有字符串"Hey"。我想确定此字符串中存在的所有字符组合尽可能快速。生成的算法应该生成:

H, e, y, He, ey, Hey

算法应该生成字符串"Hy",因为作为子字符串存在于字符串中。

2 个答案:

答案 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[],并且只与offsetlength一起“播放” - 所以在java中 - 创建实际上是O(n^2),因为创建了子串是O(1)
在C中 - 它是O(n^3),因为每个子字符串都需要复制到不同的char[]

答案 1 :(得分:0)

检查php中n-gram的实现。

在您的示例字符串中:嘿

H,E,Y是unigrams

他,EY是双胞胎

HEY是一个三元组