编辑距离
编辑距离类问题
判断子序列
思路
这题和之前的最长公共子序列有什么关系呢?
关系在于,这题的最长公共子序列长度和S1的长度相等说明有关系。
这也是编辑距离的入门题目,下面是编辑距离的基本思路
- 1、二维dp数组,dp[i][j],以i-1结尾的s1和以j-1结尾的s2的最长公共子序列。
- 2、递推公式:
- if (s1[i-1]==s2[i-2]) dp[i-1][j-1]+1;
- else dp[i][j] = max(dp[i-1][j],dp[i][j-1])
- 3、初始化:均为0
- 4、遍历顺序:
1 | var isSubsequence = function(s, t) { |
不同的子序列
https://leetcode.cn/problems/distinct-subsequences/description/
思路
这道题目如果不是子序列,而是要求连续序列的,那就可以考虑用KMP。
这道题目相对于72. 编辑距离,简单了不少,因为本题相当于只有删除操作,不用考虑替换增加之类的。
这道题可以理解为怎么删除元素可以由s变为t;
- 1、二维dp数组,dp[i][j]以i-1为结尾的s中以j-1为结尾的t的个数
- 2、递推公式:
- if (s[i-1]==t[j-1]) dp[i][j] = dp[i-1][j-1] +dp[i-1][j],使用s[i-1]这个元素+不使用s[i-1]这个元素
- else dp[i][j] = dp[i-1][j],模拟删除当前元素,也就是不考录当前的元素。
- 3、初始化:
dp[i][0] = 1
(); t是空字符串的话,把s中元素全部删除可以得到tdp[0][j] = 0
; s为空字符串,t不可能出现在s中,所以未0dp[0][0]= 1
; s和t都为空字符串的话,只有一种可能
- 4、遍历顺序:
1 | var numDistinct = function(s, t) { |
两个字符串的删除操作
https://leetcode.cn/problems/delete-operation-for-two-strings/description/
思路1
求出最长公共子序列,然后用n+m-2x,n,m,s分别表示字符串1、字符串2和最长公共子字符串的长度。
1 | var minDistance = function(word1, word2) { |
思路2
- 1、二维dp数组,dp[i][j]以i-1为结尾的word1和以j-1为结尾的word2相同需要的最少操作。
- 2、递推公式:始终记得dp数组的含义
- if (word1[i-1] == word2[i-1]) dp[i][j] = dp[i-1][j-1],如果相等说明不需要操作。
- else dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)
- 由于dp[i][j-1]= dp[i-1][j-1]+1
- 3、初始化:dp[i][0] = i,dp[0][j] = j,dp[0][0] = 0
- 遍历顺序:
1 | var minDistance = function(word1, word2) { |
编辑距离
思路
看起来好复杂哦。
题目要求讲word1转为word2的最少操作次数,但实际上我们可以从word2转为word3,或者word1和word2同时操作都可以
1、dp[i][j]: 以i-1为结尾的word1和j-1为结尾的word2的最少的操作次数
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,dp[i-1][j-1]+1)
- 上操作了
- 增:word2[i-1]增加一个字符, dp[i][j] = dp[i][j-1] + 1
- 删:删掉word1[i-1] ,dp[i][j] = dp[i-1][j]+1
- 替换:dp[i][j] = dp[i-1][j-1]+1
eg: word1 = ‘ab’ , word2 = ‘a’ , 可以是ab删掉b,也可以a增加b。dp数组如下图所示意的:
a d 1
2
3
4
5
6
7+-----+-----+ +-----+-----+-----+
| 0 | 1 | | 0 | 1 | 2 |
+-----+-----+ ===> +-----+-----+-----+
a | 1 | 0 | a | 1 | 0 | 1 |
+-----+-----+ +-----+-----+-----+
d | 2 | 1 |
+-----+-----+
3、初始化:
- dp[i][0] = i
- dp[0][j] = j
4、遍历顺序:
1 | var minDistance = function(word1, word2) { |