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

• 确定dp数组（dp table）以及下标的含义

dp[i][j]：使得 以i - 1结尾的单词word1和以j - 1结尾的单词word2 相同所需的最小步数。

• 确定递推公式

• 当word1[i - 1] 与 word2[j - 1]相同的时候
• 当word1[i - 1] 与 word2[j - 1]不相同的时候

• dp数组如何初始化

dp[i][0]：word2为空字符串，以i-1为结尾的字符串word1要删除多少个元素，才能和word2相同呢，很明显dp[i][0] = i。同理 dp[0][j] = j。

• 确定遍历顺序

• 举例推导dp数组

``````class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:使得 以i - 1结尾的单词word1和以j - 1结尾的单词word2 相同所需的最小步数 vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 1; i <= word1.size(); i++)     //单词word2为空的情况dp[i][0] = i;for (int j = 1; j <= word2.size(); j++)     //单词word1为空的情况dp[0][j] = j;for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for(int j = 1; j <= word2.size(); j++) {        //遍历单词word2if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];        //字母相同则无需无需删除字母elsedp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + 1;     //字母不相同则选一单词删除字母，取最小值}}return dp[word1.size()][word2.size()];}
};``````

``````class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:单词word1的处理区间[0, i - 1]与单词word2的处理区间[0, j - 1]中，存在的最长公共子序列的长度vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));     for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for (int j = 1; j <= word2.size(); j++) {       //遍历单词word2if (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 word1.size() + word2.size() - 2 * dp[word1.size()][word2.size()];        //两单词去除最长公共子序列}
};``````

## Leetcode 72. 编辑距离

• 插入一个字符
• 删除一个字符
• 替换一个字符

``````class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:对以i- 1结尾的单词word1和以j - 1结尾的单词word2操作，让处理后两单词相同的最少操作次数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 0; i <= word1.size(); i++)     //单词word2为空的情况dp[i][0] = i;for (int j = 1; j <= word2.size(); j++)     //单词word1为空的情况dp[0][j] = j;for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for (int j = 1; j <= word2.size(); j++) {       //遍历单词word2if (word1[i - 1] == word2[j - 1])//当前两字母相同则不用处理dp[i][j] = dp[i - 1][j - 1];    else//当前两字母不同则考虑替换word1的字母，删除word1的字母以及删除word2的字母dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j -1])) + 1;}}return dp[word1.size()][word2.size()];}
};``````

理解公共子序列问题的关键在于删除操作，两字符串的操作含义同dp数组的含义变化而变化。动态规划是在每次操作中考虑每种情况，统一处理。

### WebPack自动吐出脚本

window.c c; window.res ""; window.flag false;c function (r) {if (flag) {window.res window.res "\${r.toString()}" ":" (e[r] "") ",";}return window.c(r); }代码改进了一下&#xff0c;可以过滤掉重复的方…

### Retrofit

1.导入依赖 //Retrofit 核心库implementation("com.squareup.retrofit2:retrofit:2.9.0")//响应数据自动序列化//JSONimplementation("com.squareup.retrofit2:converter-gson:2.9.0")//String类型implementation("com.squareup.retrofit2:converter…

### 技术派整合MyBatis-Plus

Mybatis-Plus大家都熟悉了吧&#xff1f;是一个Mybatis的增强&#xff0c;提供了一些额外功能&#xff0c;比如条件构造器、分页插件、代码生成器等以便我们更专注于业务&#xff0c;而不是SQL语句的编写 官方教程&#xff1a;简介 | MyBatis-Plus 整合MyBatis-Plus 非常简单…

### 【数据结构与算法】：插入排序与希尔排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏: 数据结构与算法 欢迎大家来到初阶数据结构的最后一小节&#xff1a;排序 目录 1.排序的基本概念与分类1.1什么是排序的稳定性&#xff1f;1.2内排序与外排序内排序外排序 2.插入排序2.1实现插入排序2.3稳定性…

### 【Pytorch】进阶学习：基于矩阵乘法torch.matmul()实现全连接层

【Pytorch】进阶学习&#xff1a;基于矩阵乘法torch.matmul()实现全连接层 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

### IDEA自定义Maven仓库

Maven 是一款广泛应用于 Java 开发的工具&#xff0c;其作用类似于一个全自动的 JAR 包管理器&#xff0c;能够方便地导入开发所需的相关 JAR 包。在使用 Maven 进行 Java 程序开发时&#xff0c;开发者能够极大地提高开发效率。以下是关于如何安装 Maven 以及在 IDEA 中配置自…

### iOS——【自动引用计数】ARC规则及实现

1.3.3所有权修饰符 所有权修饰符一共有四种&#xff1a; __strong 修饰符__weak 修饰符__undafe_unretained 修饰符__autoreleasing 修饰符 __strong修饰符 _strong修饰符表示对对象的强引用&#xff0c;持有强引用的变量在超出其作用域的时候会被废弃&#xff0c;随着强引…