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

智谱清言 LeetCode 2573. 找出对应 LCP 矩阵的字符串 Python3实现

LeetCode 2573. 找出对应 LCP 矩阵的字符串
思路分析
LCP 矩阵定义:lcp[i][j] 表示字符串 s 从位置 i 和位置 j 开始的最长公共前缀长度。
核心观察:LCP 矩阵具有递推性质:
若 lcp[i][j] > 0,则 lcp[i+1][j+1] = lcp[i][j] - 1(因为去掉首字符后,公共前缀长度减1)
若 s[i] == s[j],则 lcp[i][j] = lcp[i+1][j+1] + 1;否则 lcp[i][j] = 0
算法步骤:
验证:检查 lcp 矩阵的对称性、对角线值、递推关系是否满足
构造:从后往前,利用 lcp[i][j] > 0 ⇒ s[i] == s[j] 来等价分组,贪心赋最小字符
校验:用构造出的字符串重新计算 LCP 矩阵,与输入比对
Python3 实现
class Solution:
def findTheString(self, lcp: List[List[int]]) -> str:
n = len(lcp)
# ========== 第一步:验证 LCP 矩阵的基本性质 ==========
for i in range(n):
for j in range(n):
# 对角线上 lcp[i][i] = n - i
if i == j and lcp[i][i] != n - i:
return “”
# 矩阵必须对称
if lcp[i][j] != lcp[j][i]:
return “”
# lcp 值不能越界
if lcp[i][j] > n - max(i, j):
return “”
# 递推性质:lcp[i][j] > 0 时,lcp[i+1][j+1] = lcp[i][j] - 1
if i < n - 1 and j < n - 1:
if lcp[i][j] > 0 and lcp[i + 1][j + 1] != lcp[i][j] - 1:
return “”
# ========== 第二步:贪心构造字典序最小的字符串 ==========
# 核心关系:lcp[i][j] > 0 ⟹ s[i] == s[j]
# 用并查集(或直接标记)将 s[i] == s[j] 的位置分组
s = [‘’] * n
c = ord(‘a’) # 当前可用的最小字符
for i in range(n):
if s[i]: # 已被前面的位置标记过
continue
if c > ord(‘z’): # 超出 26 个字母,无法构造
return “”
# 将所有与 i 应该相同的字符位置标记为同一字符
s[i] = chr©
for j in range(i + 1, n):
if not s[j] and lcp[i][j] > 0:
s[j] = chr©
c += 1 # 下一个位置用下一个字母
result = ‘’.join(s)
# ========== 第三步:用构造的字符串重新计算 LCP,验证一致性 ==========
# 从右下角向左上角递推计算
dp = [[0] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
for j in range(n - 1, -1, -1):
if result[i] == result[j]:
dp[i][j] = (1 + dp[i + 1][j + 1]) if (i < n - 1 and j < n - 1) else 1
else:
dp[i][j] = 0
for i in range(n):
for j in range(n):
if dp[i][j] != lcp[i][j]:
return “”
return result
关键点解释
步骤 说明
性质验证 检查对称性 lcp[i][j]==lcp[j][i]、对角线 lcp[i][i]==n-i、递推 lcp[i+1][j+1]==lcp[i][j]-1 (当lcp[i][j]>0)、边界 lcp[i][j]<=n-max(i,j)
贪心构造 遍历每个位置 i,若未赋值则分配当前最小字符 c,然后将所有 lcp[i][j]>0 的位置 j 也赋为 c(因为 lcp[i][j]>0 ⟹ s[i]==s[j])
一致性校验 用构造出的字符串重新递推计算 LCP 矩阵,与输入比对——这一步捕获"该不等但 lcp>0"的反例(例如 lcp[0][1]=0 但构造出 s[0]s[1]‘a’)
复杂度
时间:O(n²) — 三次遍历 n×n 矩阵
空间:O(n²) — 存储验证用的 dp 矩阵

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

相关文章:

  • 用PSO-SVR预测股票价格?一个Python实战案例带你避坑(数据预处理与评估是关键)
  • 四足机器人视觉循线:从阈值分割到HSV跟踪的嵌入式实现
  • 安卓7+ HTTPS抓包失效原因与Fiddler实战绕过方案
  • Godot移动端触觉反馈实战:从振动到交互语言
  • ArcGIS Pro新手村:用DEM数据5分钟搞定坡度坡向分析(附等高线提取)
  • 国防AI采购变革:如何用OTA协议与敏捷开发破解商业技术整合难题
  • 告别卡顿!用Sunshine在Linux上搭建低延迟远程桌面,平板秒变移动工作站
  • 基于物理机制的双线性对数模型:精准预测高温合金屈服强度与断裂温度
  • 用Python和xarray处理ERSST数据:一步步重现PDO指数计算(附完整代码)
  • Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 Java实现
  • SSH known_hosts冲突解决:飞牛NAS重连安全配置指南
  • MLL+KDE:高维数据统计推断的无分箱密度估计方法
  • 统信UOS服务器版初体验:除了装软件,它的包管理、开发工具链和日常运维命令跟CentOS有啥不同?
  • Qwen模型 LeetCode 2581. 统计可能的树根数目 Java实现
  • 8051单片机PDATA与XDATA存储访问优化解析
  • C#实现自动化创建Word可填写表单
  • AI依赖如何引发金融市场系统性风险:从认知退化到同质化共振
  • 高维因果推断:自动双机器学习(ADML)估计器原理与应用
  • 告别TeamViewer!在Ubuntu 22.04上安装向日葵远程控制的保姆级教程(附依赖问题解决)
  • Qwen模型 LeetCode 2584. 分割数组使乘积互质 Java实现
  • 别再死记硬背了!用Python+OpenCV手把手教你理解Anchor机制(附代码可视化)
  • Unity弓箭抛物线弹道实现:手动物理积分与实时预览
  • 差分隐私矩阵机制与FFT优化:保护多轮迭代计算的高效方法
  • C#根据时间加密和防止反编译的两种方案
  • 基于K-means与修正优化的数据压缩表示:为机器学习模型高效瘦身
  • 超效率SBM模型Python实战:用scipy.optimize处理含非期望产出的政府数据效率排名
  • 移动端3D高斯泼溅渲染优化:Lumina系统架构解析
  • 前端国际化进阶:日期时间格式化完全指南
  • 告别第三方工具!Windows 11自带SSH服务保姆级开启与开机自启教程
  • Qwen模型 LeetCode 2577. 在网格图中访问一个格子的最少时间 C语言实现