Python实现【最小循环子数组】
def find_min_repeated_subarray():
import sys
n = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))
if n == 0:
print()
return
# 计算前缀函数
pi = [0] * n
for i in range(1, n):
j = pi[i-1]
while j > 0 and nums[i] != nums[j]:
j = pi[j-1]
if nums[i] == nums[j]:
j += 1
pi[i] = j
d = n - pi[-1]
if d != 0 and n % d == 0:
print(' '.join(map(str, nums[:d])))
else:
print(' '.join(map(str, nums)))
if __name__ == "__main__":
find_min_repeated_subarray()
代码解释
- 读取输入:首先读取数组的长度 n 和数组 nums。
- 计算前缀函数:使用 KMP 算法中的前缀函数计算数组 pi,其中 pi[i] 表示子数组 nums[0..i] 的最长相同前后缀的长度。
- 确定最小周期:计算 d = n - pi[-1]。若 d 是 n 的因数且不为0,则数组可由前 d 个元素重复构成;否则返回原数组。
- 输出结果:根据计算的最小周期 d,输出对应的子数组或整个数组。