首页/新闻资讯/正文详情

牛客网 HJ52 计算字符串的编辑距离

发布时间:2026/9/24 3:59:30 来源:云帆数科 栏目:资讯中心
牛客网 HJ52 计算字符串的编辑距离
牛客网 HJ52 计算字符串的编辑距离题目链接https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314一、原题完整陈述题目描述Levenshtein距离编辑距离把字符串s变换成字符串t最少的单字符操作次数。允许3种操作每一次算1步插入一个字符删除一个字符替换一个字符求两个字符串的编辑距离。输入描述第一行字符串s小写字母长度1~1000第二行字符串t小写字母长度1~1000输出描述输出整数s和t的编辑距离样例输入abcdefg abcdef样例输出1解释s删掉末尾g或者t末尾插入g只需要1次操作。另一个经典例子kitten→sitting编辑距离3二、费曼学习法拆解破解思路讲给小白翻译成大白话给你两个单词只能增、删、改单个字母问最少要改多少次才能把第一个单词变成第二个单词。核心动态规划拆成子问题只看两个字符串前面一小段前缀算出这小段最少操作数一步步从小推到大。DP数组定义dp[i][j]s的前i个字符变成t的前j个字符最少操作次数注意s[i-1]才是第i个字符因为字符串下标从0开始dp表从0开始。边界条件最简单的子问题dp[i][0]t是空串。s前i个字符全部删掉需要i次删除。dp[i][0]idp[0][j]s是空串。空串变成t前j个字符需要j次插入。dp[0][j]j状态转移核心逻辑当处理s[i-1]和t[j-1]如果两个字符相等不用任何操作直接继承前面结果dp[i][j]dp[i−1][j−1]dp[i][j] dp[i-1][j-1]dp[i][j]dp[i−1][j−1]如果两个字符不相等有3种可选操作取最小操作数1当前这一步删除s当前字符dp[i-1][j]1在s里插入t当前字符dp[i][j-1]1把s当前字符替换成t当前字符dp[i-1][j-1]1dp[i][j]min⁡(dp[i−1][j],dp[i][j−1],dp[i−1][j−1])1dp[i][j]\min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])1dp[i][j]min(dp[i−1][j],dp[i][j−1],dp[i−1][j−1])1手动模拟小样例sabcdefgtabcdefm7n6dp[7][6]就是答案1。前面abcdef完全匹配最后多一个g删除一次即可。坑点提醒dp表的下标和字符串下标错位dp[i][j]对应s[0:i]、t[0:j]字符相等的时候不加1很多新手在这里多加1导致答案错误。字符串最大长度1000二维数组(1001 × 1001)Python完全可以承受。解法分类解法1二维DP填表机考首选直观好写下面代码解法2一维空间优化DP空间压缩面试加分减少内存解法3朴素递归重复计算长字符串会超时不推荐机考三、二维DP Python完整代码 逐行详细注释# HJ52 计算字符串编辑距离 Levenshtein距离# 动态规划二维DP版本牛客华为机考标准写法if__name____main__:# 读取第一行字符串ssinput().strip()# 读取第二行字符串ttinput().strip()# m是s的长度n是t的长度mlen(s)nlen(t)# 创建dp二维数组# dp[i][j]代表 s前i个字符 → t前j个字符的最少操作次数# 数组大小 (m1)行(n1)列全部初始化为0dp[[0]*(n1)for_inrange(m1)]# 初始化边界1t是空串 dp[i][0]# s前i个字符变成空串需要删除i次foriinrange(m1):dp[i][0]i# 初始化边界2s是空串 dp[0][j]# 空串变成t前j个字符需要插入j次forjinrange(n1):dp[0][j]j# 双重循环填表从小到大计算子问题# i遍历s的前i个字符从1到mforiinrange(1,m1):# j遍历t的前j个字符从1到nforjinrange(1,n1):# s的第i个字符s[i-1]t的第j个字符t[j-1]ifs[i-1]t[j-1]:# 字符相等不需要操作继承左上角的值dp[i][j]dp[i-1][j-1]else:# 字符不等三种方案选最小再1本次操作# 方案1删除s当前字符 dp[i-1][j]# 方案2向s插入t当前字符 dp[i][j-1]# 方案3替换当前字符 dp[i-1][j-1]dp[i][j]min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])1# dp[m][n]就是s全部字符转t全部字符的最小操作次数print(dp[m][n])测试样例输入abcdefg abcdef输出1四、空间压缩一维DP版本拓展逐行注释二维dp会占用 m*n空间一维只保留上一行空间复杂度 O(min(m,n))# HJ52 编辑距离 一维空间优化版本if__name____main__:sinput().strip()tinput().strip()# 保证t是短字符串减少数组长度iflen(s)len(t):s,tt,s mlen(s)nlen(t)# dp数组只保存上一行数据长度n1dplist(range(n1))foriinrange(1,m1):# prev保存左上角dp[i-1][j-1]的值初始是dp[i-1][0]prevdp[0]# 当前行第0列s前i字符转空串删除i次dp[0]iforjinrange(1,n1):# 暂存原来的dp[j]也就是下一轮的左上角值tempdp[j]ifs[i-1]t[j-1]:dp[j]prevelse:dp[j]min(dp[j],dp[j-1],prev)1# 更新prev保存左上角旧值prevtempprint(dp[n])五、时间空间复杂度分析二维DP版本时间复杂度O(m×n)\boldsymbol{O(m\times n)}O(m×n)两层循环每个单元格常数运算m,n是两个字符串长度空间复杂度O(m×n)\boldsymbol{O(m\times n)}O(m×n)二维数组 (m1)*(n1)一维优化版本时间复杂度O(m×n)\boldsymbol{O(m\times n)}O(m×n)时间不变空间复杂度O(min⁡(m,n))\boldsymbol{O(\min(m,n))}O(min(m,n))只保留一行数组朴素递归版本不推荐时间指数O(2max⁡(m,n))O(2^{\max(m,n)})O(2max(m,n))大量重复子问题长字符串超时。六、真实应用场景举例场景1输入法拼写纠错最经典用户输入错单词比如把helo打成hello。计算词典里所有单词和用户输入的编辑距离选出距离最小的词给出“你是不是想打hello”。搜索引擎“你是不是要搜xxx”底层就是编辑距离。场景2DNA/基因序列比对生物信息DNA是A/T/C/G字符串比较两段基因序列。插入、删除、突变对应基因变异编辑距离衡量物种基因相似度。场景3文档diff工具git diff文件对比git比较两个版本文件差异底层思想就是编辑距离算出最少增删改动。场景4数据库模糊匹配、数据清洗客户名字录入有笔误比如ZhangSan写成ZhangSanN计算编辑距离做重复数据去重。场景5OCR文字识别后校正图片识别文字经常识别错个别字母用编辑距离匹配字典修正识别结果。场景6AI文本评估大模型生成回答和标准答案做对比用编辑距离量化文本差异。七、费曼复盘总结HJ52编辑距离是字符串DP标杆题。核心思想拆前缀子问题dp[i][j]表示两个前缀之间最少操作。三种操作对应dp三个来源字符相等不用加操作步数。关键点边界空串的插入/删除次数字符相等直接继承左上角不等取三个方向最小值1二维DP直观一维DP可以压缩空间。知识点清单动态规划、二维DP、字符串DP、子问题最优子结构。拓展如果你想要我可以写记忆化递归版本代码输出每一步具体的编辑操作回溯dp表打印怎么增删改对比 LCS最长公共子序列 和编辑距离的数学关系。

相关推荐

USBlyzer实战:Windows下USB抓包与协议分析完全指南
USBlyzer实战:Windows下USB抓包与协议分析完全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 3:59:05

ESP32开发板适配指南:解决小智语音助手源码移植难题
ESP32开发板适配指南:解决小智语音助手源码移植难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 3:58:59

串口调试实战:波特率、SSCOM与VSPD虚拟串口全攻略
串口调试实战:波特率、SSCOM与VSPD虚拟串口全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 3:58:59

华为S5700 VLAN配置与排障实战指南
华为S5700 VLAN配置与排障实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 4:49:02

Kornia 修复深度解析:HyNet 与 SOSNet 半精度描述符的 CPU/GPU 稳定性改造
Kornia 修复深度解析:HyNet 与 SOSNet 半精度描述符的 CPU/GPU 稳定性改造

计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 本文基于 Kornia 仓库 changelog.d/migration-085.fixed.m… · 2026/9/24 4:48:49

@formily/reactive-vue observer:将 Vue 组件渲染变为 Reaction 响应式追踪的完整指南
@formily/reactive-vue observer:将 Vue 组件渲染变为 Reaction 响应式追踪的完整指南

前端UI组件 【免费下载链接】formily 📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 4:48:43

不要成为第二个乔布斯:AI 时代的产品经理进化论
不要成为第二个乔布斯:AI 时代的产品经理进化论

基于 Isaacson 授权传记、Stanford 演讲、The Lost Interview、Tony Fadell(iPod 之父)2026 年访谈、Netflix / Anthropic 一线实践等 30 信源的调研整理。核心结论:你不该成为「乔布斯那样的产品经理」——那套纯直觉、封闭信仰、不碰技术的… · 2026/9/24 4:48:37

CodeBurn 发布验收 Agent 执行手册:从候选 SHA 到 release-ready 的可复现审计契约
CodeBurn 发布验收 Agent 执行手册:从候选 SHA 到 release-ready 的可复现审计契约

【免费下载链接】codeburn Free, local tool to track AI coding token usage and cost across 37 tools and agents (Claude Code, Cursor, Codex, Gemini and more), by model, project, and task. npx codeburn 项目地址: https://gitcode.com/gh_mirrors/co/cod… · 2026/9/24 4:48:37

Kubernetes 高可用 etcd 集群部署:基于 kubernetes-handbook 的三节点 TLS 加密集群实战
Kubernetes 高可用 etcd 集群部署:基于 kubernetes-handbook 的三节点 TLS 加密集群实战

教程云原生容器编排 【免费下载链接】kubernetes-handbook Kubernetes 架构与生态:从云原生到 AI 原生基础设施的构建指南 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-handbook 点击查看 免费下载 本文基于 kubernetes-handbook 仓库中的… · 2026/9/24 4:48:05

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码