LeetCode 72 Edit Distance DP解法思路记录

26 篇文章 0 订阅
23 篇文章 0 订阅

leetcode 72 Edit Distance


给定两个字符串,寻找最小的操作数,使得word1变为word2.
1.可以插入字符
2.可以删除字符
3.可以替换字符

对于上面的讲解如下:
1.对应位置相同则不去扣分即不进行任何操作,不同则扣一分(需要修改)
2.两个特殊字符”-“不会对应的意思是,可以反过来理解,如果两个特殊字符对应,那么特殊字符的位置不可能是在字符之间,只有在两端,而在两端的话无任何意义,所以不存在两个特殊字符对应的情况出现
3.S 出现“-”表示需要增加字符,操作+1
4.T 出现“-”表示S中需要删除字符,操作+1

那么这个状态转移方程就可以出来了:

dp[i][j]=Math.min((dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1))?0:1),Math.min(dp[i-1][j]+1,dp[i][j-1]+1))

//注意此刻word字符得位置 长度为i 字符串的第i位为i-1
//source前i-1字符与target 前j-1字符相同,所以需要考虑source的第i个字符和target的第j个字符是否相同,若相同则不需要操作,若不同则操作需要+1

dp[i][j]= Math.min(dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1)?0:1),

//dp[i-1][j]+1 soure 字符串前i-1 与 target字符串 相同 所以差一个 需要1
//dp[i][j-1]+1 soure 字符串前i 与 target 前j-1 字符串 相同 所以差一个 需要操作1

            Math.min(dp[i-1][j]+1,dp[i][j-1]+1));

代码:

public class Solution {
    public int minDistance(String word1, String word2) {
        int len_word1 = word1.length();
        int len_word2 = word2.length();
        int dp[][] = new int[len_word1+1][len_word2+1];

        for(int i=0;i<=len_word1;i++){

            for(int j=0;j<=len_word2;j++){
                if(i==0){
                    dp[i][j]=j;//表示source没有字符,则target有j个字符就需要进行j次操作
                }
                    else if(j==0){
                     dp[i][j]=i;//同理  表示 target 没有字符,则source有i个字符就需要进行i次操作

                    }
                          //s[i-1] is the same as t[i-1] i is from 1 to i 
               else{
                   //注意此刻word字符得位置 长度为i 字符串的第i位为i-1 
                 dp[i][j]= Math.min(dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1)?0:1),
                 //dp[i-1][j]+1 soure 字符串前i-1 与 target字符串 相同 所以差一个 需要操作1  
                 //dp[i][j-1]+1 soure 字符串前i 与 target 前j-1 字符串 相同 所以差一个 需要操作1  
                Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
               }

            }

        }
        return dp[len_word1][len_word2];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值