当前位置: 首页 > news >正文

#odb0004. 最小循环子数组【B卷 200分】-字符串

题目描述

给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。

输入描述

第一行输入数组中元素个数n,1 ≤ n ≤ 100000

第二行输入数组的数字序列nums,以空格分割,0 ≤ nums[i] < 10

输出描述

输出最小的子数组的数字序列,以空格分割;

备注

数组本身是其最大的子数组,循环1次可生成的自身;

用例1

输入

9
1 2 1 1 2 1 1 2 1

输出

1 2 1

说明

数组[1,2,1,1,2,1,1,2,1] 可由子数组[1,2,1]重复循环3次拼接而成

解答

# KMP 算法
# 如果字符串s是由最小重复子串x重复产生的,
# 则最小重复子串x的长度 = s.length - 最长相同前后缀.length# 输入获取
n=int(input())
nums=list(map(int,input().split()))def getNext():# 创建长度为n的next数组,初始值全为0nxt = [0] * n# 初始化指针:j遍历字符串,k跟踪当前匹配的前缀长度j = 1  # 从第二个字符开始遍历k = 0  # 当前匹配的前缀长度# 遍历整个数组(从索引1开始)while j < n:# 当前字符与前缀的下一个字符匹配J=nums[j] # 短匹配串元素K=nums[k] # 长主串元素if J == K:nxt[j] = k + 1  # 记录匹配长度j += 1  # 移动主指针k += 1  # 增加前缀长度,指针后移else:if k > 0: # 不是长主串的第一个元素# 利用已计算的next值回溯(KMP核心优化)k = nxt[k - 1]else:# 无法回溯时,当前字符的next值为0nxt[j] = 0j += 1return nxt  # 返回计算完成的next数组# 算法入口
def getResult():# KMP算法 求nxt数组nxt = getNext()# 最长相同前后缀长度m=nxt[n-1]# 最小重复子串的长度length=n-m if n%(n-m)==0 else nreturn " ".join(map(str,nums[0:length]))# 算法调用
print(getResult())
http://www.dtcms.com/a/278237.html

相关文章:

  • DeepSeek 微调实践:DeepSeek-R1 大模型基于 MS-Swift 框架部署 / 推理 / 微调实践大全
  • JavaSE-多态
  • 2023.05.06 更新前端面试问题总结(12道题)
  • 如何将FPGA设计的验证效率提升1000倍以上(4)
  • Flink数据流高效写入MySQL实战
  • 大模型微调(一):基于Swift框架进行自我认知微调(使用Lora微调Qwen3-8B模型)
  • 芯片相关必备
  • 初识drag2框架,drag2注入的基本原理
  • [Python 基础课程]元组
  • HashMap 和 ConcurrentHashMap 的区别
  • JAVA学习笔记 JAVA开发环境部署-001
  • 【Datawhale夏令营】用AI做带货视频评论分析
  • Origin自带的悬浮尺子,Screen Ruler的最佳平替
  • C# 接口(接口可以继承接口)
  • 终极剖析HashMap:数据结构、哈希冲突与解决方案全解
  • 【面板数据】上市公司诉讼风险、诉讼次数等数据集(2007-2023年)
  • 【LeetCode100】--- 4.移动零【复习回顾】
  • 剑指offer58_和为S的连续正数序列
  • 深入理解 LangChain:AI 应用开发的全新范式
  • 人工智能到底是什么?揭开 AI 的神秘面纱
  • Spring @Autowired:依赖注入的核心奥秘
  • markdown-it-mathjax3-pro —— 新一代 Markdown 数学公式渲染插件
  • 代码精进之路
  • NumPy 中 np.c_ 的用法解析
  • Prometheus 第一篇:快速上手
  • 哪些行业的“反内卷”前景更好?
  • DL00454-深度学习牲畜资产管理圈养生猪行为识别含数据集
  • Docker搭建Redis哨兵集群
  • 代码部落 20250713 CSP-S复赛 模拟赛
  • Windows上使用配置Claude Code教程