当前位置: 首页 > 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.dtcms.com/a/323578.html

相关文章:

  • SkyWalking-3--Java Agent开发和集成示例
  • AI智能编程工具汇总
  • ComfyUI版本更新---解决ComfyUI的节点不兼容问题
  • MySQL 主备(Master-Slave)复制 的搭建
  • SOLIDWORKS 2025对工具栏等进行了重新布局和优化
  • GoEnhance AI-AI视频风格转换工具
  • gRPC 全面解析与实战 —— 从原理到同步/异步开发全攻略
  • Linux系统编程——进程地址空间
  • GM3568JHF:FPGA+ARM异构开发板环境搭建教程
  • 嵌入式学习day23-shell命令
  • Qdrant Filtering:must / should / must_not 全解析(含 Python 实操)
  • 【Python 高频 API 速学 ②】
  • 【线程池】压测确定线程池合适的参数
  • 【js】判断异步函数的返回值要加await
  • 使用LangGraph从零构建多智能体AI系统:实现智能协作的完整指南
  • 计算机系统设计中都有什么任务~计算密集~IO密集~逻辑密集等
  • 提示条贴合右侧边栏
  • java web项目入门了解
  • 天地图,cesium,leaflet
  • java练习题:数字位数
  • Windows下使用PyInstaller打包PyQt项目
  • 第15届蓝桥杯Scratch图形化省赛中级组2024年8月24日真题
  • 4深度学习Pytorch-神经网络--损失函数(sigmoid、Tanh、ReLU、LReLu、softmax)
  • Linux-JSON Schema
  • Java类和对象课上练习题目设计
  • LLM 的向量的方向表示语义,向量长度表示什么
  • Docker容器lnmp平台部署discuz论坛
  • 工具类-高效集合差异计算工具DiffWrapper
  • visual studio 无明显错误,但是无法编译成功解决—仙盟创梦IDE
  • C++入门自学Day7-- String类的自实现