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

Kimi LeetCode 3485. 删除元素后 K 个字符串的最长公共前缀 C++实现

以下是 LeetCode 3485 删除元素后 K 个字符串的最长公共前缀 的 C++ 实现。

核心思路(排序法)

参考 灵神(灵茶山艾府)的做法:

1. 排序后连续 k 个字符串的 LCP 最优:将 `words` 按字典序排序,任意 k 个字符串的最长公共前缀最大值,一定来自某个连续的 k 个字符串子数组。且该子数组的 LCP 等于首尾两个字符串的 LCP。
2. 预处理全局最大/次大 LCP:遍历所有长度为 k 的窗口,计算每个窗口首尾的 LCP,记录:
- `mx`:最大 LCP 值
- `mx2`:次大 LCP 值
- `mx_i`:最大 LCP 对应的窗口起始下标(在排序后的数组中)
3. 分类讨论:
- 若移除的字符串不在 `mx` 窗口内 → 答案为 `mx`
- 若移除的字符串在 `mx` 窗口内 → 该窗口被破坏,答案为 `mx2`
4. 边界:若 `k >= n`,移除一个后剩余不足 k 个,全填 `0`。

```cpp
class Solution {
public:
vector<int> longestCommonPrefix(vector<string>& words, int k) {
int n = words.size();

// 边界:移除一个后只剩 n-1 个,若 n-1 < k 则全为 0
if (k >= n) {
return vector<int>(n, 0);
}

// 1. 按字符串字典序对下标排序
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int a, int b) {
return words[a] < words[b];
});

// 2. 辅助函数:计算两个字符串的 LCP 长度
auto lcp = [&](const string& s, const string& t) -> int {
int i = 0;
int maxLen = min(s.size(), t.size());
while (i < maxLen && s[i] == t[i]) {
i++;
}
return i;
};

// 3. 遍历所有长度为 k 的窗口,找 mx, mx2, mx_i
int mx = 0; // 最大 LCP
int mx2 = 0; // 次大 LCP
int mx_i = 0; // 最大 LCP 窗口的起始下标

for (int i = 0; i <= n - k; i++) {
int len = lcp(words[idx[i]], words[idx[i + k - 1]]);
if (len > mx) {
mx2 = mx;
mx = len;
mx_i = i;
} else if (len > mx2) {
mx2 = len;
}
}

// 4. 构建答案
vector<int> ans(n, mx);
// 属于最大 LCP 窗口 [mx_i, mx_i + k - 1] 的原始下标,答案改为 mx2
for (int i = mx_i; i < mx_i + k; i++) {
ans[idx[i]] = mx2;
}

return ans;
}
};
```

复杂度分析

指标 复杂度
时间 `O(n log n + 总字符数)` — 排序 `O(n log n)`,所有 LCP 计算的总比较次数受限于字符串总长度(`≤ 10^5`)
空间 `O(n)` — 下标数组 + 答案数组

说明

- 排序时只排下标,不移动原字符串,保证能追溯到每个元素的原始位置。
- `lcp` 函数直接按字符比较(题目保证全为小写英文字母)。
- 当 `mx` 窗口内有多个相同字符串时,移除其中一个可能导致窗口内仍剩 `k` 个相同字符串,但按照排序后的窗口定义,该特定窗口已被破坏;此时答案退化为 `mx2`,这在题解中已被证明是正确的(若 `mx2` 与 `mx` 有交集,则 `mx2` 一定是 `mx` 的前缀,仍能满足)。

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

相关文章:

  • 汽车雨刮器设计:运动轨迹优化与材料工程解析
  • Z5140A立式钻床图纸体系与机械设计规范解析
  • STM32 继电器驱动电路 PCB 设计:3个关键布局与续流二极管 1N4007 选型
  • 基于YIG的磁可调双带吸收器设计与COMSOL仿真
  • Agent智能体开发实战:从入门到进阶
  • ncmdump终极指南:5分钟快速解锁网易云音乐NCM格式转换
  • 功率半导体热设计:原理、材料与工程实践
  • 基于Python与pytest的Kubernetes自动化测试框架设计与实践
  • 维也纳整流器原理与应用全解析
  • 分类模型评估指标实战:从混淆矩阵到AUC,5个指标在医疗与金融场景的抉择
  • SMT精密贴片工艺:核心环节与质量控制详解
  • 汽车内外饰模具设计规范与关键技术解析
  • 高速PCB设计中过孔残桩问题的分析与优化
  • 高速PCB设计中过孔阻抗控制的关键技术与实践
  • PADS泪滴功能详解与PCB设计可靠性提升
  • MIPI D-PHY/C-PHY信号完整性与EMI工程实践解析
  • PCB导电阳极丝(CAF)现象分析与防护技术
  • 医疗设备推拉自锁连接器技术解析与应用
  • PCB板挖孔设计与机械开槽技术详解
  • Wand-Enhancer终极指南:5分钟配置开源增强工具,免费解锁WeMod完整功能
  • 高速PCB信号完整性设计与传输线效应解析
  • 高速PCB设计十大误区与解决方案
  • PXIe全混合8槽背板架构与性能优化解析
  • KiCad Pcbnew层功能详解:从新手到高手的PCB设计指南
  • 数模混合PCB设计中的EMC挑战与地平面分区技巧
  • 高速PCB设计中50欧姆阻抗线的隔层参考设计方法
  • AD导入CAD文件线条丢失问题解析与解决方案
  • 模块化多电平变换器在储能系统中的应用与优化
  • NPC三电平整流器与改进型SVPWM调制算法解析
  • 如何快速上手OpenSSL:初学者必备的安装与配置教程