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

编辑距离-二维动态规划

编辑距离

Solution

枚举每一种操作即可

#include<iostream>
#include<string>
#include<vector>
using namespace std;const int inf = 1e9;
//递归做法
//f(i,j)表示从s1的i开始到s2的j开始,(选择到了s1的第i个字符,s2的第j个字符)所需要的最少操作数
//对于每一个状态,枚举各种操作,取最小值即可
//写的时候出现的核心问题就是base case的错误,当某一个字符串到达结尾的时候,不应该直接返回inf,应该考虑插入和删除
int f1(string s1, string s2, int i, int j) {int n1 = s1.length();int n2 = s2.length();if (i == n1 && j == n2)return 0;//错误就出现在这里/*if (i >= n1 || j >= n2) return inf;*///正确的base caseif (i == n1 && j < n2)//后面全部插入return n2 - j;if (j == n2 && i < n1)//后面全部删除return n1 - i;int ans1 = inf, ans2 = inf, ans3 = inf, ans4 = inf;if (s1[i] == s2[j]) ans1 = f1(s1, s2, i + 1, j + 1);//对应直接pass的情况else {ans2 = f1(s1, s2, i + 1, j + 1) + 1;//对应替换的情况ans3 = f1(s1, s2, i + 1, j) + 1;//对应删除的情况ans4 = f1(s1, s2, i, j + 1) + 1;//对应插入一个字符的情况}return min(ans1, min(ans2, min(ans3, ans4)));
}//dp做法
int f2(string s1, string s2) {int n1 = s1.length();int n2 = s2.length();vector<vector<int>>dp(n1 + 1, vector<int>(n2 + 1, 0));for (int i = n1; i >= 0; --i) {for (int j = n2; j >= 0; --j) {int ans1 = inf, ans2 = inf, ans3 = inf, ans4 = inf;if (i == n1 && j == n2) {dp[i][j] = 0;continue;}if (i == n1 && j < n2) {dp[i][j] = n2 - j;continue;}if (j == n2 && i < n1) {dp[i][j] = n1 - i;continue;}if (s1[i] == s2[j])ans1 = dp[i + 1][j + 1];ans2 = dp[i + 1][j + 1] + 1;ans3 = dp[i + 1][j] + 1;ans4 = dp[i][j + 1] + 1;dp[i][j] = min(ans1, min(ans2, min(ans3, ans4)));}}return dp[0][0];
}//dp+空间压缩
int f3(string s1, string s2) {int n1 = s1.length();int n2 = s2.length();vector<int>dp(n2 + 1, 0);int rightdown = 0, back;for (int i = n1; i >= 0; --i) {for (int j = n2; j >= 0; --j) {int ans1 = inf, ans2 = inf, ans3 = inf, ans4 = inf;back = dp[j];if (i == n1 && j == n2) {dp[j] = 0;}else if (i == n1 && j < n2) {dp[j] = n2 - j;}else if (j == n2 && i < n1) {dp[j] = n1 - i;}else {if (s1[i] == s2[j])ans1 = rightdown;ans2 = dp[j + 1] + 1;ans3 = rightdown + 1;ans4 = dp[j] + 1;dp[j] = min(ans1, min(ans2, min(ans3, ans4)));}rightdown = back;}}return dp[0];
}
int minDistance1(string word1, string word2) {return f1(word1, word2, 0, 0);
}int minDistance2(string word1, string word2) {return f2(word1, word2);
}int minDistance(string word1, string word2) {return f3(word1, word2);
}
int main() {return 0;
}

http://www.xdnf.cn/news/1271611.html

相关文章:

  • Kotlin初体验
  • git命令详解
  • 百度网盘如何做到下载速度最快?OpenSpeedy绿色安装版下载,开源免费网盘加速
  • react 常用组件库
  • Day37--动态规划--52. 携带研究材料(卡码网),518. 零钱兑换 II,377. 组合总和 Ⅳ,57. 爬楼梯(卡码网)
  • Poetry与UV——现代Python依赖管理的革新者
  • Linux 安装 JDK 8u291 教程(jdk-8u291-linux-x64.tar.gz 解压配置详细步骤)​
  • 深入理解 Gin 框架的路由机制:从基础使用到核心原理
  • 蓝牙技术概览
  • imx6ull-驱动开发篇16——信号量与互斥体
  • 练习uart和摄像头内核驱动开发测试
  • 【Python 高频 API 速学 ⑦ · 完结篇】
  • Netbsd安装使用
  • Vue3的简单学习
  • java练习题:数字位数
  • Python(6) -- 数据容器
  • I2CHAL库接口
  • MCU-基于TC397的启动流程
  • nginx高性能web服务器
  • BroadcastChannel:轻松实现前端跨页面通信
  • 使用 Ansys Discovery 进行动态设计和分析
  • ​​​​​​​【Datawhale AI夏令营】多模态RAG财报问答挑战赛:学习笔记与上分思考
  • Java基础-完成局域网内沟通软件的开发
  • B.10.01.5-电商系统的设计模式应用实战
  • Day 8: 深度学习综合实战与进阶技术 - 从优化到部署的完整流程
  • 【Datawhale AI夏令营】从Baseline到SOTA:深度剖析金融问答RAG管道优化之路
  • Mybatis进阶
  • 机器学习第七课之支持向量机SVM
  • 本地进行语音文字互转
  • P1890 gcd区间