【发布时间】:2015-08-02 18:06:32
【问题描述】:
如果我有一个长度为 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: 算法的高级视图:
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
【问题讨论】:
-
我不明白这个问题。时间复杂度如何取决于
String的长度而不取决于元组列表的长度? -
@pbabcdefp 我已经编辑了问题并添加了为什么我认为它是 O(n^2)
-
重叠是什么意思?重叠与元组有关,还是与S有关?你能举出更多的例子吗?
-
@coderz 重叠意味着如果 S 的两个子字符串共享至少 1 个位置。 (3,3) 与 (4,2) 重叠,因为它们“de”(S[4] 和 S[5],S 以 1 开头)。
-
是否需要报告每次碰撞(例如,
(0, 2)与(1, 1)碰撞,(1, 1)与(1, 2)碰撞,以及(0, 2)与(1, 2)碰撞),或者做你只需要报告每个有冲突的元组?如果您需要报告每一次碰撞,则可能不止O(n),而且仅输出所有内容可能需要比O(n)更长的时间。