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

DeepSeek LeetCode 2573. 找出对应 LCP 矩阵的字符串 Java实现

这道题要求根据 LCP (最长公共前缀) 矩阵还原出一个由小写字母组成的字符串。

解题思路

1. 理解 LCP 矩阵性质:
· LCP[i][j] 表示字符串第 i 个字符和第 j 个字符开头后缀的最长公共前缀长度
· 对角线一定是字符串长度
· 矩阵对称
· 若 LCP[i][j] > 0,则 s[i] == s[j]
2. 构造策略:
· 贪心分配字母:从第一个字符开始,如果某个位置未赋值,尽可能赋最小的可行字母
· 验证构造的字符串是否满足 LCP 矩阵

Java 实现

```java
class Solution {
public String findTheString(int[][] LCP) {
int n = LCP.length;
char[] s = new char[n];

// 贪心构造字符串
char currentChar = 'a';
for (int i = 0; i < n; i++) {
if (s[i] == 0) { // 未赋值
if (currentChar > 'z') {
return ""; // 需要超过26个字母,不可能
}
// 给所有与 i 有相同字符的位置赋值
for (int j = i; j < n; j++) {
if (LCP[i][j] > 0) {
s[j] = currentChar;
}
}
currentChar++;
}
}

// 验证构造的字符串是否满足 LCP 矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int expected = LCP[i][j];
int actual = computeLCP(s, i, j, n);
if (expected != actual) {
return "";
}
}
}

return new String(s);
}

private int computeLCP(char[] s, int i, int j, int n) {
if (i == j) return n - i;
if (s[i] != s[j]) return 0;

int len = 0;
while (i + len < n && j + len < n && s[i + len] == s[j + len]) {
len++;
}
return len;
}
}
```

优化验证方法

上面的验证方法 O(n³),可以优化到 O(n²):

```java
class Solution {
public String findTheString(int[][] LCP) {
int n = LCP.length;
char[] s = new char[n];

// 第一步:贪心构造
char currentChar = 'a';
for (int i = 0; i < n; i++) {
if (s[i] == 0) {
if (currentChar > 'z') return "";
for (int j = i; j < n; j++) {
if (LCP[i][j] > 0) {
s[j] = currentChar;
}
}
currentChar++;
}
}

// 第二步:O(n²) 验证
// 验证 LCP[i][j] 和字符相等关系的一致性
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
if (LCP[i][j] != n - i) return "";
} else {
if (LCP[i][j] != LCP[j][i]) return "";
if (LCP[i][j] > n - Math.max(i, j)) return "";

if (s[i] != s[j]) {
if (LCP[i][j] != 0) return "";
} else {
if (i + 1 < n && j + 1 < n) {
if (LCP[i][j] != 1 + LCP[i + 1][j + 1]) return "";
} else {
if (LCP[i][j] != 1) return "";
}
}
}
}
}

return new String(s);
}
}
```

核心要点

1. 正确性:利用 LCP 矩阵的性质,如果 LCP[i][j] > 0,则 s[i] == s[j],可以用这个条件将字符分组
2. 贪心赋值:按顺序给每个未赋值的组分配最小的可用字母
3. 验证:必须验证构造的字符串是否完全满足 LCP 矩阵,因为 LCP[i][j] > 0 只是必要条件,不是充分条件
4. 时间复杂度:构造 O(n²),验证 O(n²),总体 O(n²)

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

相关文章:

  • 机器学习如何重塑材料研发:从数据孤岛到智能设计平台
  • Unity Additive场景加载与卸载的深度优化指南
  • 2026安全生产月主题宣讲课件(81页)-PPT
  • 双系统Ubuntu 20.04装完没WiFi?别急着重装,试试这个Realtek网卡驱动手动编译大法
  • 分布式量子计算中的黑盒子子程序协议解析
  • 最新版建筑施工安全教育培训(30页)-PPT
  • 从‘均匀分布’到‘正态分布’:图解边缘概率密度在机器学习特征工程中的潜在应用
  • 视觉着陆系统预测不确定性:从亚像素回归到RAIM完整性监测
  • 移动端事件相机与脉冲神经网络部署实战:从理论到低功耗视觉系统构建
  • Cortex-M55缓存安全机制与MAU协同设计解析
  • BU-CVKit:模块化CV框架如何简化动物行为分析流水线
  • 心脏数字孪生:计算建模与机器学习融合重塑精准医疗
  • 解读《重大火灾隐患判定规则》GB35181-PPT
  • 软考软件设计师每日备考资料 2026年5月16日(周六) | 距考试仅剩7天(5月23-26日)**
  • 【Elasticsearch从入门到精通】第12篇:Elasticsearch读写原理——主备复制模型与数据一致性
  • Bittensor:去中心化AI网络的架构、挑战与激励模型优化
  • 实战指南:用Python和PyTorch一步步搭建TFT模型,搞定电力负荷多步预测
  • 高维非线性数据下的偏均值独立性检验:原理、实现与应用
  • 量子计算在组合优化与蛋白质折叠中的应用
  • 统信UOS/麒麟KYLINOS用户看过来:除了Termius,这款开源免费的SSH工具electerm更香吗?
  • 【Elasticsearch从入门到精通】第13篇:Elasticsearch索引API深度解析——自动创建、路由与并发控制
  • 基尔代尔 才是天才吗
  • 告别踩坑:手把手教你为openEuler 22.03 LST配置RealVNC 6.11远程桌面(含序列号激活)
  • STR91xFA Rev H内存验证错误解决方案
  • # 软考软件设计师 · 考前3天终极实战全攻略
  • 量子电路生成式AI技术:原理、应用与挑战
  • 嵌入式GPU如何实现边缘视觉应用820%性能跃迁:从架构解析到实战优化
  • XRDP远程桌面太卡?手把手教你优化Ubuntu 22.04的传输性能与画质
  • 告别K-means!用DBSCAN搞定雷达点云聚类,手把手教你调参(附Matlab代码)
  • Cortex-M55缓存维护与SAU重映射安全实践