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

Php 确定现有字符串的所有子字符串的最快方法,php,string,algorithm,permutation,combinations,Php,String,Algorithm,Permutation,Combinations,假设我有字符串“嘿”。我希望尽可能将此字符串中存在的所有字符组合确定为fast。生成的算法应生成以下内容: H, e, y, He, ey, Hey 算法不应生成字符串“Hy”,因为它不作为子字符串存在于字符串中。这些子字符串中有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

假设我有字符串
“嘿”
。我希望尽可能将此字符串中存在的所有字符组合确定为fast。生成的算法应生成以下内容:

H, e, y, He, ey, Hey
算法不应生成字符串“Hy”,因为它不作为子字符串存在于字符串中。

这些子字符串中有
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
请注意,创建迭代器是
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[]
,并且只“播放”
偏移量和
长度,因此在java中,创建实际上是
O(n^2)
,因为创建子字符串是
O(1)


然而,在C语言中,它是
O(n^3)
,因为每个子字符串都需要复制到不同的
char[]

检查php中n-grams的实现

在您的示例字符串中:Hey

H、 E,Y是单位格

他,他们是大人物


嘿,三角形是什么?为什么一定要快?一个简单的两个循环的解决方案对我来说似乎足够快…HeyHeyHey的答案是什么?它会有3个“嘿”还是只有一个?@wildplasser:从算法的角度来看,你的建议似乎是最快的解决方案。那么你尝试了什么?您需要多少优化?你需要一个吗?在什么环境下尽可能快,一些语言比其他语言做字符串更好…我知道,但我不想破坏他的家庭作业@TylerJohnson:恐怕我不熟悉php,我不知道如何在php中创建子字符串,但大多数现代语言都不需要复制字符串,但这只是一个猜测。也许php对n-gram有其他含义,但通常被称为术语/单词。1个单词是单字,2个单词是双字,3个单词是三字,。。。例如:Hi-Amit:NGrams可能暗示单词或字符。我不是用PHP编写代码,我一般都会用。我在Lucene搜索引擎中使用NGram索引来分割单词。它也可以是术语/单词或字符。
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)