假设您的匹配序列中可以有“洞”(A = [1,3,2] AND B = [1,4,2] 然后 MatchSet = {1,2})
也许我错了,但你可以试试这个伪代码:
i <- 0; j <- 0; jHit <- -1
matchSet <- Empty
While i < Length(A) AND j < Length(B):
If A[i] == B[j] Then
matchSet.add(A[i])
i <- i+1
jHit <- j
End If
j <- j+1
If j == Length(B) Then
i <- i+1
j <- jHit+1
End If
End Loop
第一个索引 (i) 指向 B 中未找到的 A 的下一个元素,而 (j) 用于查找 B 的下一个元素(在 A 中找到的最后一个元素之后)。
这会给你 O(mN) 的时间复杂度和 O(N) 的空间使用量。
这里有一个 Python 实现:
def match(A,B):
i = 0
j = 0
jHit = -1
res = []
while i < len(A) and j < len(B):
if A[i] == B[j]:
res.append(A[i])
i += 1
jHit = j
j += 1
if j == len(B):
i += 1
j = jHit+1
return res