LeetCode 目录
LeetCode 4:寻找两个有序数组的中位数 [困难][二分]
Leetcode 8:字符串转换整数 (atoi) [中等]
LeetCode 54:螺旋矩阵Ⅰ
LeetCode 59:螺旋矩阵 Ⅱ
LeetCode 111: 二叉树的最小深度[递归/非递归求解/队列]
LeetCode 149:一条直线上最多的点数
LeetCode 365:水壶问题 [中等] [DFS][数学]
LeetCode 350: 两个数组的交集 II [简单]
LeetCode 150:计算逆波兰式(后缀表达式)的值
LeetCode 876:链表的中间节点 [简单]
LeetCode 945: 使数组唯一的最小增量 [中等]
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
Tips:是用来度量两个序列相似程度的指标。通俗地来讲,编辑距离指的是在两个单词
第一感觉就是算法课上的动态规化算法,动态规划算法重要的时找到状态转移矩阵
有以下结论:
对单词 word1 删除一个字符和对单词 word2 插入一个字符是等价的
对单词 word1 替换一个字符和对单词 word2 替换一个字符是等价的
本质上不同的操作只有3种
状态转移方程:
D[i][j] = min(D[i][j−1]+1,D[i−1][j]+1,D[i−1][j−1])
= 1 + min(D[i][j−1],D[i−1][j],D[i−1][j−1]−1)
D[i][j] = 1 + min(D[i][j−1],D[i−1][j],D[i−1][j−1])
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.length();
int m = word2.length();
//有一个字符串为空串
if(n*m==0){
return n+m;
}
//动态规化数组
int dp[n+1][m+1];
//边界状态初始化
for(int i=0;i<n+1;i++){
dp[i][0] = i;
}
for(int j=0;j<m+1;j++){
dp[0][j] = j;
}
//动态规化计算所有的dp值
for(int i=1;i<n+1;i++){
for(int j=1;j<m+1;j++){
int left = dp[i-1][j] + 1;
int down = dp[i][j-1] + 1;
int left_down = dp[i-1][j-1];
if(word1[i-1] != word2[j-1]) left_down += 1;
dp[i][j] = min(left,min(down,left_down));
}
}
return dp[n][m];
}
};