leetcode刷题详解十一

⭕️583. 两个字符串的删除操作
  • 思路:核心代码就是最长公共子序列,但是需要注意的是结果

    就是如果说公共子序列为0,则需要两个字符串长度的才行

    如果有,就是 n + m ∗ 2 d p [ n ] [ m ] n+m*2dp[n][m] n+m2dp[n][m]

int minDistance(string word1, string word2) {int n = word1.size();int m = word2.size();vector<vector<int>> dp(n+1, vector<int>(m+1, 0));for(int i = 1; i < n + 1; i++){for(int j = 1; j < m + 1; j++){if(word1[i - 1] == word2[j - 1]){dp[i][j] = dp[i - 1][j - 1] + 1;}else{dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}return n+m-2*dp[n][m];
}
712. 两个字符串的最小ASCII删除和

本质上换汤不换药~参考前面的公共子序列问题。

int minimumDeleteSum(string s1, string s2) {int n = s1.size();int m = s2.size();vector<vector<int>> dp(n+1, vector<int>(m+1, 0));int ascii_count = 0;for(int i = 0; i < n; i++){ascii_count += s1[i];}for(int i = 0; i < m; i++){ascii_count += s2[i];}for(int i = 1; i < n + 1; i++){for(int j = 1; j < m+1; j++){if(s1[i-1] == s2[j-1]){dp[i][j] = dp[i-1][j-1] + (int)s1[i-1];}else{dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}if(dp[n][m] == 0){return ascii_count;}return  ascii_count-2*dp[n][m];         }
1035. 不相交的线
  • 思路:本质就是求最长公共子序列!!!!!!

    因为这道题两个连线不想交,你想想,如果不想交,不就是公共子序列,按顺序找吗???

    leetcode真的恶心

int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {int n = nums1.size();int m = nums2.size();vector<vector<int>> dp(n+1, vector<int>(m+1, 0));for(int i = 1; i < n + 1; i++){for(int j = 1; j < m + 1; j++){if(nums1[i - 1] == nums2[j - 1]){dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[n][m];}
392. 判断子序列
  • 思路:这道题很简单,但是道题给了另一个不简单的方向,即要匹配的字符串就数十亿个,如何考虑?

  • 简单的:

    脑瘫写法:

    bool isSubsequence(string s, string t) {int n = s.size();int m = t.size();if(n == 0){return true;}int temp = 0;for(int i = 0; i < m; i++){if(s[temp] == t[i]){temp++;if(temp == n){return true;}}}return false;}
    

    双指针:

    bool isSubsequence(string s, string t) {int i = 0;int j = 0;int n = s.size();int m = t.size();while(i < n && j < m){if(s[i] == t[j]){i++;}j++;}return i == n;}
    
  • 进阶数十亿的:

    如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10 亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

    空间换时间的思想。关键点是:利用一个二维数组记录每个位置的下一个要匹配的字符的位置,这里的字符是'a' ~ 'z',所以这个数组的大小是 dp[n][26],n 为 T 的长度。那么每处理一个子串只需要扫描一遍 S 即可,因为在数组的帮助下我们对 T 是“跳跃”扫描的。

    如下图一,很自然的,当T索引为0时候,对应的第0列就是当前字符在T中出现位置的下标,没有的标-1就行;

    451f324be3121d731c1bd49ae62db5d
    /*ahbgdc这个T字符串构成的数组如下:重点在于从后往前构造会简单很多*/
    1 -1 -1 -1 -1 -1 -1 
    3 3 3 -1 -1 -1 -1 
    6 6 6 6 6 6 -1 
    5 5 5 5 5 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    4 4 4 4 -1 -1 -1 
    2 2 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    -1 -1 -1 -1 -1 -1 -1 
    

    这个图应该能说明思想,其实就是跳表的思想,只要有-1就不比了,不用完全遍历t,时间换空间的思想。

    bool isSubsequence(string s, string t) {t.insert(0, ' ');int len = t.size();vector<vector<int>> vec(len, vector<int>(26, 0));//创建一个二维数组for(char char_t= 'a'; char_t <= 'z'; char_t++){int next_pos = -1;//这个要放在循环里面!不能放在外面!for(int i = len-1; i >=0 ;i--){vec[i][char_t-'a'] = next_pos;if(t[i] == char_t){next_pos = i;}}}//开始匹配int index = 0;for(char c : s){index = vec[index][c - 'a'];if(index == -1){return false;}}return true;
    }
    
115. 不同的子序列
  • 思路:

    说句题外话,就是两个字符串或者数字比较的话,大概率不是dp就是双指针,dp的话ij表示s1的前i个和s2的前j个

    同时,子序列或者字串的话,切记,空串是任何序列的子序列!

    因此这道题也很常规,但是难点就在于状态转移方程不好想

    首先给出状态转移方程:

    if (s[i - 1] == t[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j];}
    

    状态转移方程为啥是上述的?只有一个办法,就是画表。以后看到子序列问题的dp ,画表就完事儿了!!!!

    image-20220501220905568
    int numDistinct(string s, string t) {int n = s.size();int m = t.size();if(n < m){return 0;}vector<vector<long long>> dp(n+1, vector<long long>(m+1, 0));//切记!空字符串匹配为1for(int i = 0; i < n + 1; i++){dp[i][0] = 1; }for(int i = 1; i < n + 1; i++){for(int j = 1; j < m + 1; j++){if(s[i - 1] == t[j - 1]){dp[i][j] = dp[i - 1][j - 1] + dp[i -1][j];if(dp[i][j]>INT_MAX){dp[i][j]=0;}}else{dp[i][j] = dp[i - 1][j];}}}return dp[n][m];}
    
⭕️72. 编辑距离
  • 前面说过两个单词或者两个字符串的问题不是双指针就是动态规划问题,很明显这个这么难的问题就是动态规划。

    同时又是两个字符串比较,那肯定 d p [ i ] [ j ] dp[i][j] dp[i][j]啊!主要是这个状态转移方程不太好想

    当两个字符不相等的时候,有三种操作:删除、插入和替换!!!这才是状态转移方程的重点!!

    word1[i] == word2[j]dp[i][j] = dp[i-1][j-1]

    word1[i] != word2[j]dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1

    其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。

int third_min(int a, int b, int c){int temp = a < b ? a : b; return temp < c ? temp : c;
}
int minDistance(string word1, string word2) {int n = word1.size();int m = word2.size();vector<vector<int>> dp(n+1, vector<int>(m+1, 0));//确定完dp后还是得考虑极端情况for(int i = 0; i < m + 1; i++){dp[0][i] = i ;}for(int i = 0; i < n + 1; i++){dp[i][0] = i ;}for(int i = 1; i < n + 1; i++){for(int j = 1; j < m + 1; j++){if(word1[i - 1] == word2[j - 1]){dp[i][j] = dp[i - 1][j - 1];}else{dp[i][j] = third_min(dp[i - 1][j - 1] + 1, //替换dp[i - 1][j] + 1,     //word1删除一个字符然后换和word2相同的,这个是一个操作dp[i][j - 1] + 1     //word2删除一个字符然后换和word1相同的,这个是一个操作);}}}return dp[n][m];
}

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

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

相关文章

【LeetCode刷题】数组篇1

&#x1f387;数组简单题Part &#x1f308; 开启LeetCode刷题之旅 &#x1f308; 文章目录 &#x1f387;数组简单题Part&#x1f370;1.两数之和&#x1f451;思路分析1.暴力法2.哈希表法 &#x1f370;26.删除有序数组中的重复项&#x1f451;思路分析1.双指针2.利用vector…

Trapcode Suite 2024.0.2

Trapcode Suite是一款用于在After Effects中模拟和建模3D粒子和效果的软件。 该软件包包含11种不同的工具&#xff0c;可以帮助用户模拟火、水、烟、雪等粒子效果&#xff0c;以及创建有机视觉效果和3D元素。它还支持在AE与PR 2022插件&#xff0c;使得用户可以轻松地在后期制作…

11月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年11月20日-11月26日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营…

《第一行代码:Android》第三版-如何为一个Activity添加layout文件

确切地说就是讲如何给一个不带view的Activity添加一个view&#xff0c;就是添加一个layout文件。 新建安卓项目&#xff0c;如果选择&#xff1a;就会给你创建一个没有view的Activity&#xff0c;如果后来你发现需要为这个Activity添加view&#xff0c;就是添加一个布局文件怎…

又有两大巨头官宣加入鸿蒙, 鸿蒙已成, 华为余承东说得没错

自从华为发布HarmonyOS 4系统后&#xff0c;宣布下一个鸿蒙版本将不再支持安卓应用&#xff0c;并启动鸿蒙原生应用&#xff0c;随后国内巨头纷纷响应&#xff0c;为鸿蒙系统开发原生应用。 如今&#xff0c;又有两大巨头官宣加入鸿蒙&#xff0c;一家是广汽传祺&#xff0c;M…

软著项目推荐 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

CodeTON Round #7 (Div. 1 + Div. 2)

A.jagged Swaps 题意&#xff1a; 给出一个包含 n n n个数字的序列&#xff0c;每次可以选择一个同时大于左右两边相邻的数字&#xff0c;将这个数字与它右边的数字交换&#xff0c;问能否在经过若干次操作后使序列变为升序。 分析&#xff1a; 由于交换只能向后进行&#…

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时&#xff0c;可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容&#xff0c;避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…

C#-串口通信入门及进阶扩展

目录 一、串口相关参数介绍 1、端口&#xff08;COM口&#xff09; 2、波特率&#xff08;Baud rate&#xff09; 3、起始位 4、停止位&#xff08;StopBits&#xff09; 5、数据位 6、校验位 7、缓存区 二、串口通信助手 三、虚拟串口工具 四、进阶扩展 1、位运算…

InnoDB存储引擎中的锁

文章目录 概要一、需要解决的问题二、共享锁和独占锁1.1 锁定读1.2 表级别的共享锁、独占锁 三、行锁3.1 数据准备3.2 几种常见的行级锁3.3 行锁升级为表锁 概要 关于MySQL涉及到的锁&#xff0c;大致可以总结如下&#xff1a; MyISAM存储引擎在开发过程中几乎很少使用了&…

SpringSecurity+JWT实现权限控制以及安全认证

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户​ 授权&…

Spring Boot + MyBatis-Plus实现数据库读写分离

文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 &#x1f389;Spring Boot …

【多线程】-- 06 线程状态之线程停止与休眠

多线程 5 线程状态 线程的五大状态&#xff1a;创建状态、就绪状态、阻塞状态、运行状态、死亡状态。如下图所示&#xff1a; 具体解释如下&#xff1a; 线程方法&#xff1a; 5.1 停止线程 不推荐使用JDK提供的stop()方法、destroy()方法【已废弃 – deprecated】推荐线程自…

NX二次开发UF_CSYS_create_csys 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_csys Defined in: uf_csys.h int UF_CSYS_create_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates a CSYS. 创…

京东API接口的接入(京东工业)

在技术交流群&#xff0c;大家有探讨稳定获取京东商品主图、价格、标题&#xff0c;及sku的完整解决方案。这个引起了我技术挑战的兴趣。 目前&#xff0c;自己做了压测&#xff0c;QPS高、出滑块概率极低&#xff0c;API整体稳定&#xff0c;可满足业务场景的性能需求。 公共…

Appium PO模式UI自动化测试框架——设计与实践

1. 目的 相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说&#xff0c;它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广…

面试题:海量PDF的OCR处理思路

关键点&#xff1a; 1000wPDF&#xff1a;数据量非常大。3天处理完&#xff1a;有时间限制。一篇PDF1~10s&#xff1a;可能需要以最高10s去做计算&#xff0c;这样时间才能保证留有富余。要求资源最大化利用&#xff1a;也就是尽可能节省服务器资源&#xff0c;能复用尽量复用&…

【EI会议征稿】第四届应用数学、建模与智能计算国际学术会议(CAMMIC 2024)

第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09; 2024 4th International Conference on Applied Mathematics, Modelling and Intelligent Computing 第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09;将于…

JOSEF约瑟 逆功率继电器 GG-21 5a 100v 50hz

系列型号 GG-21逆功率继电器 GG-22过载继电器 1 用途 逆功率继电器GG-21/5A/100V 在出现逆功率时&#xff0c;从电网中断开交流发电机。 2 概述 逆功率继电器是基于感应式原理(具有旋转磁场)而工作。 继电器导磁体由两个磁路系统组成&#xff1a;上磁路系统和下磁路系统…

【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数

8.10 函数的默认参数 C在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值&#xff0c;当函数调用的时候如果没有指定这个值&#xff0c;编器会自动用默认值代替。 通过为函数参数指定默认值&#xff0c;可以在调用函数时省略相应的参数&#xff0c;而该参数将使用…