代码随想录打卡第38天:动态规划解决编辑距离和回文串

1.72编辑距离

1.问题描述

找到其中需要进行操作的最少次数。

2.问题转换

大体思路可以参照前面的两个字符串的删除操作。添加操作可以将其看做是一个另类的删除操作,所以最后全部都可以看做是一个删除操作

3.解题思路

  1. 每一个位置的word1[i]和word2[j]都有两种状态:是否相等
  2. 如果相等:那么不进行任何操作
  3. 如果不相等:那么此时有两种情况:1.删除word1[i](也可以是添加word1[i]到word2[j]的位置)。2.删除word2[j](也可以看做是添加word2[j]到word1[i]的位置)确定其最小值就是最少操作次数。

4.为什么使用动态规划?

因为每一个位置的状态都能由前面的状态递推出来

5.动态规划的具体实现

  1. dp[i][j]数组的含义:代表的是从word1[0..i]word2[0..j]最少需要操作的次数保证能够完全匹配。
  2. 递推公式:
    if(word1[i-1] == word2[j-1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = min(dp[i][j-1]+1,dp[i-1][j]+1);}
  3. 初始化:for(int i = 0;i<m+1;i++)dp[i][0] = i;for(int j = 1;j<n+1;j++)dp[0][j] = j;因为对于一个是空的字符串,另外一个非空,需要将其全部删除,所以需要进行如下的初始化
  4. 遍历顺序:由递推公式可以知道,应该是从上到下,从左到右的遍历顺序。
class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size();int n = word2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(int i = 0;i<m+1;i++)dp[i][0] = i;for(int j = 1;j<n+1;j++)dp[0][j] = j;for(int i = 1;i<m+1;i++){for(int j = 1;j<n+1;j++){if(word1[i-1] == word2[j-1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = min({dp[i][j-1],dp[i-1][j],dp[i-1][j-1]})+1;}}}return dp[m][n];}
};

2.647回文子串

1.问题描述

找到其中回文子串的数目。回文字符串 是正着读和倒过来读一样的字符串。

2.问题转换

以i或者i,i+1为中心,向两边遍历,相等则为一个回文子串。

3.解题思路

  1. 判断s[i..j]是否是一个回文串。即判断s[i]是否和s[j]相等
  2. 如果相等:如果里面的长度小于等于1,代表一定是回文串,如果里面的长度大于1的时候,判断里面是否是回文串,如果是,那么此时是回文串,如果里面不是,那么此时就不是回文串。
  3. 如果不相等:那么一定不是回文串

4.为什么使用动态规划?

因为每一个位置的状态都能由前面的状态递推出来

5.动态规划的具体实现

  1. dp[i][j]数组的含义:代表的是s[i..j]是否是一个回文串。
  2. 递推公式:
    if(s[i]!=s[j]){dp[i][j] = false;}else{if (j - i <= 1) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}}
  3. 初始化:vector<vector<bool>> dp(n,vector<bool>(n,false));默认情况下都不是回文子串,只有i==j的时候默认是回文串,可以在前面初始化,也可以直接在遍历中设置。
  4. 遍历顺序:由递推公式可以知道,i是从从大到小,j是从小到大,因为i代表左边界,j代表的是右边界,如果需要进行扩大的话,是需要向两端扩的。
class Solution {
public:int countSubstrings(string s) {//第一种方法使用动态规划的方式来确定回文子串/*int n = s.size();int result = 0;vector<vector<bool>> dp(n,vector<bool>(n,false));//代表的是表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。for(int i = n-1;i>=0;i--){for(int j = i;j<n;j++){if(s[i]!=s[j]){dp[i][j] = false;}else{if (j - i <= 1) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}}}}return result;*///第二种方式:使用二分法int n = s.size();int res = 0;for(int i = 0; i < n; ++i){for(int j = i, k = i; j >=0 && k < n; --j,++k)//以i为中心有多少个回文子串{if(s[j] != s[k]) break;++res;}for(int j = i, k = i+1; j >=0 && k < n; --j,++k)//以i,i+1两个为整体有多少个回文子串{if(s[j] != s[k]) break;++res;}}return res;}
};

3.516最长回文子序列

1.问题描述

找到其中最长的回文子串的长度。

2.问题转换

从[i..j]之间中最长的回文子串,只需要找到相同的就代表长度+2.

3.解题思路

  1. 求解s[i..j]最长回文子串的长度。即判断s[i]是否和s[j]相等
  2. 如果相等:长度+2
  3. 如果不相等:那么在s[i+1..j]或者s[i..j-1]中找到最长的回文子串作为此时的长度

4.为什么使用动态规划?

因为每一个位置的状态都能由前面的状态递推出来

5.动态规划的具体实现

  1. dp[i][j]数组的含义:代表的是s[i..j]的最长回文子串的长度。
  2. 递推公式:
    if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1]+2;}else{dp[i][j] = max(dp[i+1][j],dp[i][j-1]);}
  3. 初始化:for(int i = 0;i<n;i++){//因为单个字符也是回文子序列dp[i][i] = 1;}
  4. 遍历顺序:由递推公式可以知道,i是从从大到小,j是从小到大,因为i代表左边界,j代表的是右边界,如果需要进行扩大的话,是需要向两端扩的。
class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n,vector<int>(n,0));//dp[i][j]:s[i,j]数组的最长的回文子序列for(int i = 0;i<n;i++){//因为单个字符也是回文子序列dp[i][i] = 1;}for(int i = n-2;i>=0;i--){//由于dp[i][j] = max(dp[i+1][j],dp[i][j-1]);所以i是从从大到小,j是从小到大,递推for(int j = i+1;j<n;j++){if(s[i] == s[j]){dp[i][j] = dp[i+1][j-1]+2;}else{dp[i][j] = max(dp[i+1][j],dp[i][j-1]);}}}return dp[0][n-1];}
};

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

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

相关文章

RTOS原理和应用总结

RTOS的作用 RTOS一般应用在中低端处理器当中&#xff0c;这里举一个笔者日常开发遇到的案例来说明RTOS的作用。 假设你有一个设备&#xff0c;这个设备的外围硬件很多&#xff0c;假设有LED、一个网口、若干RS232等等。 在没有RTOS的时候&#xff0c;我们用裸机编程来写&…

HTML5 多媒体应用技术

目录 多媒体元素 audio元素video元素多媒体事件与JavaScript交互音频和视频轨道(Track)媒体API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

数据库同步软件,天不生PanguSync万古如长夜

在信息时代的海洋中&#xff0c;数据是那永不熄灭的灯塔&#xff0c;照亮了科技发展的航道。然而&#xff0c;随着数据的膨胀和应用场景的多样化&#xff0c;如何确保这些宝贵资源在不同平台、不同设备间实时更新、保持一致性&#xff0c;便成了一道亟待解决的难题。于是&#…

Android File Transfer for mac(强大的安卓文件传输工具) 直装版

Android File Transfer是一款专门为Mac用户设计的软件&#xff0c;它用于在Android设备与Mac之间传输文件。这款软件提供了简单直观的操作界面&#xff0c;使用户能够轻松地在Android设备和Mac之间传输和管理文件。 下载地址&#xff1a;https://www.macz.com/mac/7099.html?i…

使用python实现socket进行消息传输-demo

Socket 是什么 Socket 是一种在计算机网络中用于实现进程间通信的一种机制。它是网络编程中的重要概念&#xff0c;通过它可以在不同的计算机之间进行数据传输和通信。Socket 可以用于实现各种网络应用&#xff0c;包括客户端-服务器模型、P2P 应用等。基本上&#xff0c;Sock…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下&#xff0c;两条橙色线之间&#xff1a; 黄色的点就意味着L的上下界&#xff0c;物理意义是当轨迹ss1时&#xff0c;L的范围应该是(Lmin1,Lmax1)之间&#xff0c;这个范围就是开辟…

学习日记.1

今天就是配置了droidbot的环境。主要的知识来源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme&#xff0c;注意只需要platform就好&#xff0c;sdk太大不用下载…

《Ai企业知识库》-模型实践-rasa开源学习框架-基础理论-02

rasa官网 Conversational AI Platform | Superior Customer Experiences Start Here rasa简介&#xff1a; Rasa是一个开源的机器学习框架&#xff0c;专门用于构建自动化的文本和语音对话系统&#xff0c;即聊天机器人。它允许开发者和企业创建定制化的对话体验&#xff0c…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

el-upload 上传多个视频

<el-form-item label"视频" prop"video_url"><el-uploadclass"upload-demo"ref"uploadRef":multiple"true":on-change"handleChange":before-remove"beforeRemove":before-upload"before…

Flutter 中的 EditableText 小部件:全面指南

Flutter 中的 EditableText 小部件&#xff1a;全面指南 在Flutter中&#xff0c;EditableText是一个低级别的文本编辑组件&#xff0c;它提供了构建自定义文本编辑界面的能力。与TextField和TextFormField不同&#xff0c;EditableText提供了更多的灵活性&#xff0c;允许开发…

【LinuxC语言】链接文件

文章目录 前言一、inode索引节点inode的作用为什么inode重要 二、文件链接的定义文件链接是什么硬链接&#xff08;Hard Link&#xff09;软链接&#xff08;符号链接&#xff0c;Symbolic Link&#xff09;硬链接图示&#xff1a;软链接图示&#xff1a; 硬链接应用场景限制和…

五步定位性能瓶颈

一、着手测试前的准备&#xff1a;优化数据流向与系统架构分析 在进行性能测试或系统优化之前&#xff0c;明确数据流向和系统架构的细节是至关重要的步骤。这不仅能够帮助识别潜在的瓶颈&#xff0c;还能确保测试用例设计的全面性与针对性。以下是关键步骤和方法&#xff1a;…

实现本地访问云主机,以及在云主机搭建FTP站点

前言 云计算是一种基于互联网的计算模式&#xff0c;通过网络提供按需访问的计算资源和服务。核心概念是把计算能力视作一种公共资源&#xff0c;用户可以根据自身需求动态分配和管理这些资源。 云主机 ECS (Elastic Compute Server)是一种按需获取的云端服务器&#xff0c;提…

142.栈和队列:用栈实现队列(力扣)

题目描述 代码解决 class MyQueue { public:stack<int> stIn; // 输入栈&#xff0c;用于push操作stack<int> stOut; // 输出栈&#xff0c;用于pop和peek操作MyQueue() {}void push(int x) {stIn.push(x); // 将元素压入输入栈}int pop() {// 如果输出栈为空&…

虚拟列表 vue-virtual-scroller 的使用

npm 详情&#xff1a;vue-virtual-scroller - npm (npmjs.com) 这里我使用的是RecycleScroller。 App.vue <template><RecycleScrollerclass"scroller":items"items":item-size"54"v-slot"{ item }"><list-item :it…

Flask Response 对象

文章目录 创建 Response 对象设置响应内容设置响应状态码设置响应头完整的示例拓展设置响应的 cookie重定向响应发送文件作为响应 总结 Flask 是一个 Python Web 框架&#xff0c;用于快速开发 Web 应用程序。在 Flask 中&#xff0c;我们使用 Response 对象来构建 HTTP 响应。…

【论文笔记】advPattern

【论文题目】 advPattern: Physical-World Attacks on Deep Person Re-Identification via Adversarially Transformable Patterns Abstract 本文首次尝试对深度reID实施鲁棒的物理世界攻击。提出了一种新颖的攻击算法&#xff0c;称为advPattern&#xff0c;用于在衣服上生成…

文本转语音软件-TTSMaker

一、TTSMaker介绍 TTSMaker&#xff08;马克配音&#xff09;是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言&#xff0c;以及超过300种语音风格。 可…

C语言指针相关知识(第四篇章)(非常详细版)

文章目录 前言一、什么是回调函数二、qsort函数的介绍(默认升序排序)三、qsort函数的模拟实现&#xff08;通过冒泡排序&#xff09;总结 前言 本文介绍了回调函数&#xff0c;qsort函数的使用&#xff0c;以用冒泡排序来模拟实现qsort函数 提示&#xff1a;以下是本篇文章正文…