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

代码随想录训练营第45天|编辑距离

115. 不同的子序列

class Solution {
public:int numDistinct(string s, string t) {s.insert(s.begin(),' ');t.insert(t.begin(),' ');int ns=s.length();int nt=t.length();vector<vector<uint64_t>> dp(ns,vector<uint64_t>(nt,0));for(int i=0; i<ns; i++){dp[i][0]=1;}for(int i=1; i<ns; i++){for(int j=1; j<nt; j++){if(s[i]==t[j])dp[i][j]=dp[i-1][j-1]+dp[i-1][j];elsedp[i][j]=dp[i-1][j];}}return dp[ns-1][nt-1];}
};

dp[i][j]:截止到s[i],t[j](包含)的两个子串所形成的子序列个数。

转移方程:

1.若结尾不等,则s[i]无法发挥作用,只能由i-1前的子串构建,个数等同于dp[i-1][j]

2.若结尾相等,则有两种选择:

  • s[i]参与构建,则s的i-1前的子串要负责构建t的j-1部分的序列,个数为dp[i-1][j-1]
  • s[i]不参与构建,则s的i-1前的子串要负责构建全部t的序列,个数为dp[i-1][j]

583. 两个字符串的删除操作

class Solution {
public:int minDistance(string word1, string word2) {word1.insert(word1.begin(),' ');word2.insert(word2.begin(),' ');int n1=word1.length(), n2=word2.length();vector<vector<int>> dp(n1,vector<int>(n2,0));for(int j=1; j<n2; j++){dp[0][j]=j;}for(int i=1; i<n1; i++)dp[i][0]=i;for(int i=1; i<n1; i++){for(int j=1; j<n2; j++){if(word1[i]==word2[j])dp[i][j]=dp[i-1][j-1];elsedp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;}}return dp[n1-1][n2-1];}
};

dp[i][j]:由word1[0:i]到word2[0:j]的最小删除操作数目

转移方程:

1.若结尾相等,则不会增加操作数,由dp[i-1][j-1]转移而来

2.若结尾不等,则有两种可能:

  • 删除word1的结尾,由dp[i-1][j]转移而来
  • 删除word2的结尾,由dp[i][j-1]转移而来

取二者较小。

72. 编辑距离

class Solution {
public:int minDistance(string word1, string word2) {word1.insert(word1.begin(),' ');word2.insert(word2.begin(),' ');int n1=word1.length(), n2=word2.length();vector<vector<int>> dp(n1,vector<int>(n2,0));for(int j=1; j<n2; j++)dp[0][j]=j;for(int i=1; i<n1; i++)dp[i][0]=i;for(int i=1; i<n1; i++){for(int j=1; j<n2; j++){if(word1[i]==word2[j])dp[i][j]=dp[i-1][j-1];elsedp[i][j]=min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;}}return dp[n1-1][n2-1];}
};

dp[i][j]:由word1[0:i]到word2[0:j]的编辑距离

转移方程:

1.若结尾相等,则不会增加编辑距离,由dp[i-1][j-1]转移而来

2.若结尾不等,则有三种可能:

  • 删除word1的结尾,由dp[i-1][j]转移而来
  • 删除word2的结尾,由dp[i][j-1]转移而来
  • 修改word1与word2的最后一位,由dp[i-1][j-1]转移而来。

取三者较小。

相关文章:

  • 如何构建鲁棒高性能 Prompt 的方法?
  • IIS HTTPS 网页可能暂时无法连接,或者它已永久性地移动到了新网址 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
  • docker简单熟悉
  • 技术分享|一文读懂三维建模技术
  • 18年408数据结构
  • Python Web架构:微服务与服务网格的实践
  • Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具
  • SD2.0 Specification之功能切换
  • 【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络
  • 群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)
  • gtk4学习
  • SPI驱动学习七(SPI_Slave_Mode驱动程序框架)
  • AI驱动的Java开发框架:Spring AI Alibaba实战部署教程
  • C++之STL—常用排序算法
  • TDSQL-C电商可视化,重塑电商决策新纪元
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译]CSS 居中(Center)方法大合集
  • 2017 年终总结 —— 在路上
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android 控件背景颜色处理
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • HTTP中的ETag在移动客户端的应用
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Linux中的硬链接与软链接
  • Rancher-k8s加速安装文档
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 浮现式设计
  • 看域名解析域名安全对SEO的影响
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序填坑清单
  • 线上 python http server profile 实践
  • 线性表及其算法(java实现)
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 责任链模式的两种实现
  • 交换综合实验一
  • #{}和${}的区别是什么 -- java面试
  • #define、const、typedef的差别
  • $ git push -u origin master 推送到远程库出错
  • (1)(1.9) MSP (version 4.2)
  • (11)MATLAB PCA+SVM 人脸识别
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2015)JS ES6 必知的十个 特性
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (Ruby)Ubuntu12.04安装Rails环境
  • (十)Flink Table API 和 SQL 基本概念
  • **PHP分步表单提交思路(分页表单提交)
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET MVC 验证码
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式