【LeetCode】动态规划——72.编辑距离、10.正则表达式匹配

LeetCode题目链接
https://leetcode.cn/problems/edit-distance/description/
https://leetcode.cn/problems/regular-expression-matching/description/

题解
72.编辑距离
本题要定义为长度为i、长度为j的字符串的最少编辑次数,每次判断字符的下标为i-1、j-1。dp[i][j]的状态由dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]共同决定,从dp[i-1][j]到dp[i][j]表示word1加上下标为i-1的字符后,与word2的距离差距,可以得知dp[i][j]=dp[i-1][j]+1;同理可得dp[i][j]=dp[i][j-1]+1,即word1加上第j-1个字符后所需的操作的个数多了个1,可以理解为删除;同理,此处需判断两个字符串的当前下标为i-1的字符和下标为j-1的字符是否相等,如果相等,就不需要增加操作个数,直接等于dp[i-1][j-1]即可,如果不相等,需要替换一次(不是删除两次,要求最小操作个数),则就等于dp[i-1][j-1]+1。由此可以的值最终dp[i][j]由上三者取最小值即可。同时对于初始化,由于第0行和第0列分别代表空字符串与word1、word1的挨个字符所需的操作次数,因此需要初始化为对应的递增值,简单点可以直接初始化为下标i、下标j的值即可。

10.正则表达式匹配
思路详见题解,c++版代码详见评论区。
需要注意的是判断*这个字符时,它与前面一个字符的组合可以被干掉,也就是可以重复0次(根据题意),因此可以往前跳两位字符再继续判断。

代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word2.size() + 1, vector<int>(word1.size() + 1, 0));for (int i = 0;i <= word2.size();i++) {dp[i][0] = i;}for (int j = 0;j <= word1.size();j++) {dp[0][j] = j;}for (int i = 1;i <= word2.size();i++) {for (int j = 1;j <= word1.size();j++) {if (word2[i - 1] == word1[j - 1]) {dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1]));}else {dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));}}}printf("dp[i][j]\n");for (int i = 0;i <= word2.size();i++) {for (int j = 0;j <= word1.size();j++) {printf("%d ", dp[i][j]);}printf("\n");}return dp[word2.size()][word1.size()];}
};int main() {Solution s;string word1 = "intention";string word2 = "execution";printf("%d", s.minDistance(word1, word2));return 0;
}
//10.正则表达式匹配
#include <iostream>
#include <vector>
#include <string>
using namespace std;class Solution {
public:bool isMatch(string s, string p) {if (p.empty() && !s.empty()) return false;//if (s.empty() && !p.empty() && p[j - 1] != '*') return false;vector<vector<bool>> dp(s.size() + 1, vector<bool>(p.size() + 1, false));dp[0][0] = true; //两个空字符串for (int j = 1;j <= p.size();j++) {  //s为空,但p因为* 可以干掉一个字符(即题意中的可以重复零次)if (p[j] == '*')dp[0][j + 1] = dp[0][j - 1];}for (int i = 1;i <= s.size();i++) {for (int j = 1;j <= p.size();j++) {if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {dp[i][j] = dp[i - 1][j - 1];}else {if (p[j - 1] == '*') {if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {dp[i][j] = dp[i][j - 2] || dp[i - 1][j - 2] || dp[i - 1][j];   //重复0次、重复1次、重复2次以上}else {dp[i][j] = dp[i][j - 2];  //不匹配,*干掉一个字符}}}}}return dp[s.size()][p.size()];}
};int main() {Solution s;string str1 = "ab";string str2 = ".*";printf("%d", s.isMatch(str1, str2));return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97300.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[亲测可用]Android studio配置国内镜像源 Kotlin DSL (build.gradle.kts)

一、更改gradle下载镜像Android studio项目需要下载和更新 Gradle 及其依赖。由于网络环境&#xff0c;直接从 Gradle 官网下载可能会遇到速度慢或超时的问题。这里需要更换为使用国内的镜像站点来加速下载。官网地址&#xff08;较慢&#xff09;&#xff1a;https://services…

《跳出“技术堆砌”陷阱,构建可演进的软件系统》

很多团队陷入了“技术焦虑式开发”—盲目追逐热门框架&#xff0c;将“使用微服务”“引入云原生”“集成AI组件”当作架构先进的标签&#xff0c;却忽视了业务与技术的底层匹配逻辑。某互联网团队为了“彰显技术实力”&#xff0c;在内部协同工具中强行接入机器学习推荐模块&a…

赋能你的应用:英超实时数据接入终极指南(API vs. WebSocket)

在当今数据驱动的时代&#xff0c;为您的应用程序注入实时、准确的英超赛事数据&#xff0c;是提升用户体验、打造差异化竞争力的关键。无论是开发一款球迷必备的比分追踪App&#xff0c;一个深度专业的赛事分析平台&#xff0c;还是一个充满互动性的梦幻足球游戏&#xff0c;首…

计算机网络:(poll、epoll)

一、select的不足1. 最大监听数受限&#xff1a;FD_SETSIZE 默认 1024&#xff08;Linux&#xff09;2. 每次调用需重置 fd_set&#xff1a;内核会修改集合&#xff0c;必须每次重新 FD_SET3. 用户态与内核态拷贝开销大4. 返回后仍需遍历所有 fd 才能知道哪个就绪5. 效率随 fd …

网络编程之设置端口复用

首先来说一下为什么要设置端口复用&#xff0c;有些时候在调试服务器代码时势必会经常启动或结束服务器进程&#xff0c;这样就会出现当再次启动服务器时有可能会出现端口绑定失败的情况&#xff0c;造成这个情况的原因是由于你上次关闭服务器时有连接尚未断开等等其他原因&…

stargo缩扩容starrocks集群,实现节点服务器替换

1.背景在企业中可能需要&#xff0c;将starrocks的某一台服务器下架&#xff0c;换上另一台服务器&#xff0c;如何实现这个操作&#xff0c;本篇将进行介绍&#xff1b;节点hadoop101hadoop102hadoop103hadoop104集群原集群节点新节点fe✔✔❌&#xff08;下线&#xff09;✔&…

Linux -- 进程间通信【命名管道】

目录 一、命名管道定义 二、命名管道创建 1、指令 2、系统调用 3、删除 三、匿名管道和命名管道的区别 四、命名管道的打开规则 五、代码示例 1、comm.hpp 2、server.cc 3、client.cc 一、命名管道定义 # 匿名管道存在以下核心限制&#xff1a; 仅限亲缘关系进程&a…

LinuxC系统多线程程序设计

一.多线程程序设计1. 线程概述&#xff1a;1.1 什么是线程?线程是进程中的一个实体(组成单元),是系统进程调度的最小单元。一个进程至少具有一个线程&#xff0c;如果进程仅有一个线程&#xff0c;该线程就代表进程本身。把代表进程本身的线程称为主线程&#xff0c;一个进程…

Vue3 + TS + MapboxGL.js 三维地图开发项目

文章目录 1. 安装依赖 2. 新建 Map 组件(components/MapView.vue) 3. 在页面中使用(views/Home.vue) 4. 效果说明 1. 安装依赖 npm install mapbox-gl @types/mapbox-gl --save⚠️ 注意:需要去 Mapbox 官网,申请一个 access token。 package.json {"name":…

【编程语言】Rust 入门

目录 一、Rust 是什么&#xff1f;为什么选择它&#xff1f; 二、环境搭建&#xff0c;迈出第一步 2.1 Windows 系统安装步骤 2.2 macOS 系统安装步骤 2.3 Linux 系统安装步骤 2.4 安装过程中的常见问题及解决方案 三、基础语法&#xff0c;构建知识大厦的基石 3.1 变量…

Python 编码与加密全解析:从字符编码到 RSA 签名验证

在 Python 开发中&#xff0c;字符编码&#xff08;如 UTF-8、GBK&#xff09;和 数据加密&#xff08;如 Base64、MD5、RSA&#xff09;是处理数据传输、存储安全的核心技术。本文结合实战代码&#xff0c;从基础的字符编解码入手&#xff0c;逐步深入到加密算法的应用&#x…

关于shell命令的扩展

目录 一、逻辑运算符 1. &&&#xff08;AND&#xff09; 2. ||&#xff08;OR&#xff09; 3. 组合使用&#xff1a;A && B || C 二、输出与重定向 1. echo 输出 2. 标准文件描述符&#xff08;FD&#xff09; 3. 重定向操作符 4. 同时重定向 stdout 和…

MySQL EXPLAIN 查看执行计划详解

MySQL 的 EXPLAIN 命令。这是一个分析和优化 SQL 查询性能不可或缺的强大工具。它展示了 MySQL 如何执行一条 SQL 语句&#xff0c;包括如何使用索引、表连接顺序、估计的行数等关键信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 语句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面试题及详细答案 120道(51-60)-- 模型保存、加载与部署

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 51. TensorFlow中保存和加…

从零开始学Shell编程:从基础到实战案例

从零开始学Shell编程&#xff1a;从基础到实战案例 文章目录从零开始学Shell编程&#xff1a;从基础到实战案例一、认识Shell&#xff1a;是什么与为什么学1.1 Shell的定义1.2 常用Shell解释器二、Shell编程快速入门&#xff1a;编写第一个脚本2.1 步骤1&#xff1a;创建脚本文…

机器学习算法全景解析:从理论到实践

机器学习算法全景解析&#xff1a;从理论到实践引言机器学习作为人工智能的核心组成部分&#xff0c;正在深刻地改变我们的世界。从推荐系统到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;机器学习算法无处不在。本文将全面系统地介绍机器学习的主要算法类别及其核心…

week5-[二维数组]对角线

week5-[二维数组]对角线 题目描述 给定一个 nnn\times nnn 的正方形二维数组&#xff0c;输出它两条对角线上元素的和。 输入格式 输入共 n1n 1n1 行。 第 111 行 111 个正整数 nnn。 接下来 nnn 行&#xff0c;每行 nnn 个正整数 aija_{ij}aij​ 表示这个二维数组。 输出格式…

GoogLeNet:深度学习中的“卷积网络变形金刚“

大家好&#xff01;今天我们要聊一个在深度学习领域掀起革命的经典网络——GoogLeNet&#xff08;又称Inception v1&#xff09;。这个由Google团队在2014年提出的模型&#xff0c;不仅拿下了ImageNet竞赛冠军&#xff0c;更用"网络中的网络"设计理念彻底改变了卷积神…

笔记本电脑蓝牙搜索不到设备-已解决

方法1打开疑难解答&#xff0c;选择其他疑难解答&#xff0c;下划选择蓝牙&#xff0c;点击运行&#xff0c;电脑自行检测并修复蓝牙方法2右键此电脑&#xff0c;选择管理&#xff0c;找到自己的蓝牙设备。然后对箭头指向的这个点击右键&#xff0c;选择《更新驱动程序》&#…

WPF 程序用户权限模块利用MarkupExtension实现控制控件显示

工作记录 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML标记扩展 实现了什么作用&#xff1a;通过扩展标记将一种输入转化为另一种类型的输出 思路&#xff1a; 不直接设置控件的Visib…