如果我有一个长度为n的字符串S,和一个元组列表(a,b),其中a指定S的子字符串的起始位置,b是子字符串的长度。为了检查任何子串是否重叠,我们可以在S中标记每次接触的位置。然而,如果元组列表的大小为n(循环元组列表,然后循环S),我认为这将需要O(n^2)时间。
有没有可能在O(n)时间内检查任何子字符串是否实际上与其他子字符串重叠?
例如,S =“abcde”。元组= [(1,2),(3,3),(4,2)],表示“ab”,“cde”和“de”。当读取(4,2)时,我想知道是否发现重叠。
我认为它是O(n^2),因为每次都会得到一个元组,然后您需要循环遍历S中的子字符串,以查看是否标记为脏。
编辑2: 一旦检测到碰撞,我无法退出。想象一下,我需要报告所有后续发生碰撞的元组,因此必须遍历整个元组列表。
编辑3: 算法的高层视图:
有没有可能在O(n)时间内检查任何子字符串是否实际上与其他子字符串重叠?
例如,S =“abcde”。元组= [(1,2),(3,3),(4,2)],表示“ab”,“cde”和“de”。当读取(4,2)时,我想知道是否发现重叠。
我认为它是O(n^2),因为每次都会得到一个元组,然后您需要循环遍历S中的子字符串,以查看是否标记为脏。
编辑2: 一旦检测到碰撞,我无法退出。想象一下,我需要报告所有后续发生碰撞的元组,因此必须遍历整个元组列表。
编辑3: 算法的高层视图:
for each tuple (a,b)
for (int i=a; i <= a+b; i++)
if S[i] is dirty
then report tuple and break //break inner loop only
(0, 2)
与(1, 2)
发生碰撞,您需要报告两个元组还是其中一个? - user2357112