两个字符串的删除操作
动态规划1
数组含义: 以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
递推公式:
当两个不相等(有三种情况)
(最后当然是取最小值)
初始化: 当一个字符串是空的时, 需要几步才能变成相同的呢, 答案是i或者j
- class Solution {
- public int minDistance(String word1, String word2) {
- //动规一, 通过取删除操作的最小值
- int len1 = word1.length();
- int len2 = word2.length();
- int[][] dp = new int[len1 + 1][len2 + 2];
- //初始化, 都是i
- //这里是<=, 因为要让数组正好等于string长度
- for(int i = 0; i <= len1; i++){
- dp[i][0] = i;
- }
- for(int j = 0; j <= len2; j++){
- dp[0][j] = j;
- }
- //开始遍历
- for(int i = 1; i <= len1; i++){
- for(int j = 1; j <= len2; j++){
- //如果相等的话又不用操作
- if(word1.charAt(i - 1) == word2.charAt(j - 1)){
- dp[i][j] = dp[i - 1][j - 1];
- } else {
- //不相等, 要么删i要么删j, 最小值
- dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
- }
- }
- }
- return dp[len1][len2];
- }
- }
动态规划2:
本题基础上和LC1143(最长公共子序列)是有点相似的, 只需要算出总共相同的字母长度, 然后全部的减去这个值就行了
- class Solution {
- public int minDistance(String word1, String word2) {
- int len1 = word1.length();
- int len2 = word2.length();
- int[][] dp = new int[len1 + 1][len2 + 1];
- //这个版本的话先求最长公共子序列, 初始值必然是0
- for(int i = 1; i <= len1; i++){
- for(int j = 1; j <= len2; j++){
- if(word1.charAt(i-1) == word2.charAt(j-1)){
- //如果相等长度就加一
- dp[i][j] = dp[i-1][j-1] + 1;
- } else {
- //否则分别退一步,看哪个大
- dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
- }
- }
- }
- //最后算出来的是长度, 所以两个加起来减去长度*2
- return len1 + len2 - dp[len1][len2]*2;
- }
- }
编辑字符
给你两个word, 请计算出将word1转换成word2所使用的最小操作数(上一题只需要删除, 这里可以进行插入, 删除, 和替换)
仍然还是经典五部曲:
- class Solution {
- public int minDistance(String word1, String word2) {
- int len1 = word1.length();
- int len2 = word2.length();
- int[][] dp = new int[len1 + 1][len2 + 1];
- for(int i = 0; i <= len1; i++){
- dp[i][0] = i;
- }
- for(int j = 0; j <= len2; j++){
- dp[0][j] = j;
- }
- for(int i = 1; i <= len1; i++){
- for(int j = 1; j <= len2; j++){
- if(word1.charAt(i - 1) == word2.charAt(j - 1)){
- //相等则不做任何操作
- dp[i][j] = dp[i - 1][j - 1];
- } else {
- //不相等则做, 删除和替换的操作
- dp[i][j] = Math.min(Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1),
- dp[i-1][j-1] + 1);
- }
-
- }
- }
- return dp[len1][len2];
- }
- }