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

Kimi k2.6 LeetCode 3036. 匹配模式数组的子数组数目 II Go实现

这道题的核心思路是 KMP 字符串匹配。

思路

1. 预处理:将 `nums` 数组中相邻元素的差值符号提取出来,得到长度为 `n-1` 的 `diff` 数组:
- `nums[i+1] > nums[i]` → `diff[i] = 1`
- `nums[i+1] == nums[i]` → `diff[i] = 0`
- `nums[i+1] < nums[i]` → `diff[i] = -1`

2. KMP 匹配:问题转化为在 `diff` 数组中统计 `pattern` 出现的次数。由于数据范围最大为 10^6,必须使用 KMP 算法在 O(n+m) 时间内完成。

Go 实现

```go
func countMatchingSubarrays(nums []int, pattern []int) int {
n := len(nums)
if n <= 1 {
return 0
}

// 1. 预处理 nums,得到相邻元素的符号数组 diff
diff := make([]int, n-1)
for i := 1; i < n; i++ {
diff[i-1] = getSign(nums[i-1], nums[i])
}

// 2. 使用 KMP 算法统计 pattern 在 diff 中的出现次数
return kmp(diff, pattern)
}

// 计算两个数的符号关系
func getSign(a, b int) int {
if a < b {
return 1
}
if a > b {
return -1
}
return 0
}

// KMP 算法,返回 pattern 在 text 中的出现次数(允许重叠)
func kmp(text, pattern []int) int {
m := len(pattern)
if m == 0 {
return len(text) + 1
}
if len(text) < m {
return 0
}

lps := buildLPS(pattern)
count := 0
i, j := 0, 0 // i 指向 text,j 指向 pattern

for i < len(text) {
if text[i] == pattern[j] {
i++
j++
if j == m {
count++ // 找到一个匹配
j = lps[j-1] // 继续匹配下一个(允许重叠)
}
} else if j > 0 {
j = lps[j-1] // 回退到最长公共前缀
} else {
i++ // pattern[0] 都不匹配,text 指针前进
}
}
return count
}

// 构建 pattern 的最长公共前后缀数组 (LPS)
func buildLPS(pattern []int) []int {
m := len(pattern)
lps := make([]int, m)

for i, j := 1, 0; i < m; i++ {
for j > 0 && pattern[i] != pattern[j] {
j = lps[j-1]
}
if pattern[i] == pattern[j] {
j++
lps[i] = j
}
}
return lps
}
```

复杂度分析

- 时间复杂度:O(n + m)。预处理 O(n),KMP 匹配 O(n + m)。
- 空间复杂度:O(n + m)。`diff` 数组占用 O(n),LPS 数组占用 O(m)。

http://www.jsqmd.com/news/967653/

相关文章:

  • Claude 3.5取消显式思维链:从可解释黑箱到不可见白箱的范式迁移
  • 2026欧米茄官方售后服务体系全面升级,维修门店新址与服务热线同步官宣 - 欧米茄中国服务中心
  • 别再死记硬背了!用几何动画和日常例子彻底搞懂Jensen不等式
  • 2026 西安卫生间漏水维修口碑好机构 TOP4:靠谱防水修缮甄选指南 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 冠盾建筑修缮
  • 英雄联盟回放视频制作:从玩家到导演的转变之路
  • Docker磁盘告急?除了`prune`,这5个隐藏的磁盘空间回收技巧你可能不知道
  • 阳泉周六全城上门回收黄金,这六家一个电话30分钟到家 - 余生黄金回收
  • 终极指南:5分钟免费解锁网易云音乐NCM格式,让你的音乐随处可听
  • 深度专访实录:2026 温州专业汽车贴膜优质企业技术实力调研白皮书 - 资讯纵览
  • WRF模式输出变量太多看不懂?用Python和NCL快速提取你关心的气象要素(附代码)
  • 告别样式烦恼:用GeoServer的CSS插件和osm-styles项目,一键还原OpenStreetMap官方地图效果
  • 用DGL和PyTorch复现异构图注意力网络HAN:从IMDB电影分类到DBLP学者分类的实战指南
  • 21个中国城市群边界SHP数据包(EPSG:3857,开箱即用)
  • LabVIEW读取Excel汉字数据踩坑实录:报表工具与文件I/O两种方案,哪种更适合你?
  • 智能表单生成实战:用 LLM 从 JSON Schema 到生产级 UI 渲染
  • Steam成就管理神器:终极完整指南与安全使用教程
  • 2026年5月汽车音响店技术亲测首推武汉繁声汽车音响 - 资讯纵览
  • 遗传算法工程化实战:参数设计、算子组合与早熟防控
  • Sunshine游戏串流:打造个人云游戏服务器的终极指南
  • 重庆南坪欧米茄海马回收攻略|六店梯队排名与避坑要点 - 诚鑫名品
  • WechatDecrypt终极指南:三步实现微信聊天记录本地解密与备份
  • Twincat3新数据类型(LINT, UNION, WSTRING)详解:在64位系统下如何优化你的PLC程序
  • 2026贵阳西服定制高性价比榜单 | 新手避坑优选7家本土老牌定制店 - 商业快讯早知道
  • 别再死记硬背了!用几何动画直观理解Jensen不等式(凸函数/凹函数)
  • Windows窗口置顶神器:三分钟掌握AlwaysOnTop高效工作法
  • 2026 广州黄金回收机构深度测评:六家正规商家横向对比,添价收黄金奢侈品回收中心综合实力稳居榜首 - 薛定谔的梨花猫
  • 从迅为iTOP4412到你的电脑:一次搞定Samba 4.14.7编译与全平台(Win7/Win10/XP)访问配置
  • 2026 福州厨卫屋面地下室漏水测评靠谱防水商家对比参考 - 吉修匠
  • 贝叶斯统计中的隐形支柱:手把手推导Beta分布与Gamma函数的关系
  • 解锁游戏新境界:Wand-Enhancer如何让你的WeMod体验全面升级