【代码随想录】刷题Day56刷题Day57

news/2024/10/18 18:23:42/

 刷题Day56

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

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

1.dp数组的含义:dp[i][j]是i-1位置的word1字母与j-1位置的word2字母为结尾时,两个字符串的删除的数目

2.dp数组的操作:首先if(word1[i-1]==word2[j-1]),此时两个对应末尾位置的字母一致,那么此时不需要删除任何字母,也就是说此时的删除数和前面一次两个字符串比较的删除次数一致,故dp[i][j]=dp[i-1][j-1];此外如果if(word1[i-1]!=word2[j-1]),说明两个字母不相同,需要删除字母,有两种删除方法,一种删除word1[i-1],一种删除word2[j-1],不论他们哪一个删除,都会增加一次删除的次数,我们需要求的是最小的那一次,那么我们就取两个删除数的较小值dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);

3.初始化:以为其实dp[i][j]是由dp[i-1][j]和dp[i][j-1]推出来的,我们需要初始化dp[i][0]和dp[0][j],当下标为0时,说明对应的一个字符串一定是空字符串。那么我们能知道对于另外一个下标,我们一定要删除全部才和空字符串一致,即为dp[i][0]=i和dp[0][j]=j。

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

2.编辑距离

72. 编辑距离

1.dp数组的含义:dp[i][j]是i-1位置的word1字母与j-1位置的word2字母为结尾时,两个字符串的修改次数

2.dp数组的操作:首先if(word1[i-1]==word2[j-1]),此时两个对应末尾位置的字母一致,那么此时不需要编辑任何字母,也就是说此时的编辑数和前面一次两个字符串比较的编辑次数一致,故dp[i][j]=dp[i-1][j-1]。此外如果if(word1[i-1]!=word2[j-1]),说明两个字母不相同,那么有三种操作可以做,增删改,但是其实删除和增加是一样的,一个word删除其实在操作次数上和另一个word增加是没有区别的,那么其实就是两个删和改。对于删除就是min(dp[i-1][j]+1,dp[i][j-1]+1),对于改,意思其实就是将所谓的word1[i-1]和word2[j-1]变为一样的,那么其实就是dp[i][j]在dp[i-1][j-1]的基础上把两个都改了,操作加一,所有条件为dp[i-1][j-1]+1。取最小值dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));

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

刷题Day57

1. 回文子串

647. 回文子串

1.如果只是判断两个字母,那么无法知道中间的是否是回文,所以根据这一问题能延申出一个基本事实,我们如果想要实现动态规划的思路,那么一定想要:1.i和j位置的字母相同;2.i+1和j-1里面的字母是回文的 。这才能推出ij位置是回文

2.dp数组的含义:dp[i][j]为i到j范围内,子字符串是否是回文子串,是则存为true

3.dp数组的操作:如果s[i] == s[j],其实有三种情况,1.i==j,此时不需要考虑直接true,2.i+1==j,此时为两个字母,也不需要考虑,直接true 3.则需要判断是否dp[i + 1][j - 1] == true,如果是则dp[i][j] 为true

class Solution {
public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(), vector<bool>(s.size(), false));int ret = 0;for (int i = s.size() - 1; i >= 0; i--){for (int j = i; j < s.size(); j++){if (s[i] == s[j]){if (j - i <= 1 || (j - i > 1 && dp[i + 1][j - 1] == true)){dp[i][j] = true;ret++;}}}}return ret;}
};

2.最长回文子序列

516. 最长回文子序列

1.由于是子序列,所以我们需要定义的dp数组和条件会多一些限制

2.dp数组的含义:dp[i][j]为i到j范围内子序列的最大回文

3.dp数组的操作:

如果s[i] == s[j],说明此时可构成回文子序列,那么我们需要对数组进行更新,1.如果i==j,dp[i][j]=1,表示只有一个回文串 2.如果如果i==j-1,dp[i][j]=2,表示有两个个回文串 3.如果i<j-1,那么dp[i][j] = dp[i + 1][j - 1] + 2,表示之间的子序列最大回文数加i和j位置的两个字母构成更大的回文。

如果s[i] != s[j],我们那么此时i到j位置的最大回文串其实继承于里面的最大回文情况,我们需要比较 i+1位置到j位置 和 i位置到j-1位置 的回文串,哪个更大,再更新。条件为dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>>dp(s.size(), vector<int>(s.size(), 0));for (int i = s.size() - 1; i >= 0; i--){for (int j = i; j < s.size(); j++){if (s[i] == s[j]){if (i == j)dp[i][j] = 1;else if (j - i == 1)dp[i][j] = 2;elsedp[i][j] = dp[i + 1][j - 1] + 2;}elsedp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);}}return dp[0][s.size() - 1];}
};


http://www.ppmy.cn/news/381406.html

相关文章

好用的Windows数据恢复软件--傲梅恢复之星

​数据恢复软件有什么用&#xff1f; 现在&#xff0c;人们拥有大量的文件需要保留和保护&#xff0c;包括照片、视频、文档、游戏等等。了解数据安全的用户会利用云存储服务和外部设备来存储和备份重要的数据。 但更多的用户并不重视数据备份。这样做是相当危险的&#xf…

STM32F401RCT6基于Arduino框架点灯程序

STM32F401RCT6基于Arduino框架点灯程序 &#x1f4cc;本示例基于《【开源电路】STM32F401RCT6开发板》 ✨经测试&#xff0c;这次跑示例程序没有遇到像STM32F103VET6那样的串口乱码的bug&#xff0c;串口打印正常。 &#x1f4d3;串口指定方式 &#x1f4cb;翻阅固件源码可…

STM32入门:STM32F401CDU6库函数工程文件搭建

STM32F401CDU6库函数工程文件搭建 根据下图的结构进行复制粘贴操作&#xff0c;代码部分在本文末有贴出来&#xff0c;STM32F4xx-DSP-StdPeriph-Lib-V1.8.0文件下载&#xff08;使用part1即可&#xff09; 完成以上操作后&#xff0c;将Output与Listing生成的文件置于OBJ文件…

STM32F401超声波proteus仿真

STM32F401超声波仿真 文章目录 前言一、仿真效果二、相关代码1.串口2.LCD3.SFR04 总结 前言 仿真功能描述&#xff1a; 使用串口和LCD屏输出SFR04距离数据 proteus版本8.11 安装包链接&#xff1a;https://pan.baidu.com/s/1yhNKLl1lGSU9KU0tTuAxcg?pwddxe8 提取码&#xff…

【STM32f401学习之路-02】USART串口通信

文章目录 USART 简介USART的功能运用USART的配置USART接收发送USART 接收字节数据点灯 USART 简介 什么是UART?–>串口 作用&#xff1a;两个设备/器件之间进行信息交换 例子&#xff1a;MCU与WIFI通信&#xff0c;MCU与PC通信&#xff0c;MCU与传感器通信 通信是产品的核…

【STM32f401学习之路-00】搭建工程环境

搭建stm32f4环境及工程 工程搭建MDK&#xff0c;固件库&#xff0c;芯片包下载创建工程 工程搭建 MDK&#xff0c;固件库&#xff0c;芯片包下载 下载keil5&#xff0c;stm32f4xx的固件库以及stm32f4的芯片包 keil官网&#xff1a;https://www2.keil.com/mdk5/ stm32中国官网…

将RT-Thread Nano移植到STM32F401CCU6

将RT-Thread Nano移植到STM32F401CCU6 使用RT-Thread(后面简称RTT)是一次偶然的机会&#xff0c;之前并没有使用过嵌入式操作系统&#xff0c;一直使用前后台的方式实现单片机的程序处理&#xff0c;后来发现使用嵌入式操作系统真的很方便&#xff0c;尤其是在UI刷新和实时响应…

HAL库使用硬件SPI驱动0.96寸OLED stm32F401

找一个可以使用SPI接口的OLED驱动程序&#xff0c;一般买OLED会提供&#xff0c;或者自己网上找&#xff0c;这里用的是中景园的例程。由于我使用的开发板是STM32F401ccu6&#xff0c;所以我先移植到我的开发板上&#xff0c;主要改的打开MXcube 配置时钟 配置DEBUG&#xff0c…