题解 | #计算字符串的编辑距离#

计算字符串的编辑距离

https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314

//两个字符串最短编辑距离
//这道题确实比较难, 注意是状态不知道怎么确定, 
//dp[i][j] 字符串a 的前i个字符 和字符串b 的前j个字符所需的最短编辑距离, 
// 当 a[i-1] == b[j-1]时, dp[i][j] = dp[i-1][j-1]
// 否则  dp[i][j] = min( dp[i-1][j-1]+1 ,dp[i-1][j]+1 ,dp[i][j-1]+1 )
//							替换				插入			删除

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        String a= sc.nextLine();
        String b = sc.nextLine();
        //定义dp数组, 表示a的前i个字符, 和b的前j的字符 相同所需的编辑距离
        int [][]dp = new int[a.length()+1][b.length()+1];
        //初始化dp数组, 任意一个字符串为空时, 需要的操作次数是另一个字符串的长度
        for (int i = 0; i <= b.length(); i++)
        {
            dp[0][i] = i;
        }
        for (int i = 0; i <= a.length(); i++)
        {
            dp[i][0] = i;
        }

        //给dp数组赋值
        //dp[i][j] = min( dp[i-1][j-1]+1 ,dp[i-1][j]+1 ,dp[i][j-1]+1 )  需要操作
        //                  替换               插入         删除
        //当 a[i]==b[j] 时, dp[i][j] = dp[i-1][j-1]   不需要操作

        //从左到右, 从上到下遍历
        for (int i = 1; i <= a.length(); i++)
        {
            for (int j = 1; j <= b.length(); j++)
            {
                if(a.charAt(i-1)==b.charAt(j-1))
                {
                    dp[i][j] = dp[i-1][j-1];
                }
                else
                {
                    dp[i][j] = Math.min( dp[i-1][j-1]+1 , Math.min( dp[i-1][j]+1 ,dp[i][j-1]+1 ) );
                }
            }
        }
        System.out.println( dp[a.length()][b.length()] );
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务