本文共 1870 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到一个最小的位置 K,使得给定的两个序列 a 和 b 之间存在连续的子序列匹配。我们将使用 KMP 算法来高效地解决这个问题。
问题分析:
KMP 算法:
实现步骤:
import sysdef kmp_search(text, pattern): M = len(pattern) N = len(text) if M > N: return [] partial = [-1] * (M + 1) for i in range(1, M): j = partial[i-1] while j != -1 and pattern[i] != text[j+1]: j = partial[j] if pattern[i] == text[j+1]: j += 1 partial[i] = j result = [] i = j = 0 while i < N: if text[i] == pattern[j]: i += 1 j += 1 if j == M: result.append(i - M + 1) j = partial[j-1] i = i - (M - j) else: if j != 0: j = partial[j-1] else: i += 1 return resultdef main(): input = sys.stdin.read data = input().split() idx = 0 T = int(data[idx]) idx += 1 for _ in range(T): N = int(data[idx]) M = int(data[idx+1]) idx +=2 a = list(map(int, data[idx:idx+N])) idx +=N b = list(map(int, data[idx:idx+M])) idx +=M if M > N - M + 1: print(-1) continue result = kmp_search(a, b) if result: print(min(result)) else: print(-1)if __name__ == "__main__": main()
kmp_search 函数:
main 函数:
这种方法确保了在处理大规模数据时的高效性,能够在合理时间内解决问题。
转载地址:http://bgjfk.baihongyu.com/