🤖
AI审核中

编辑距离的最少操作数动态规划解法

文章摘要

本文介绍了求两个仅含小写字母的字符串之间最少编辑操作数的问题,操作包括插入、删除和修改。给出示例说明计算过程,并提供基于动态规划的 O(n·m) 解法。实现中使用两行滚动数组 dp,分别记录当前行和前一行的最优值,通过字符相等与否分别处理转移,最终返回 dp[str1.length % 2][str2.length] 即编辑距离。

题目链接:https://www.nowcoder.com/practice/6a1483b5be1547b1acd7940f867be0da

题目描述

给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。

你可以对字符串进行3种操作:

1.插入一个字符

2.删除一个字符

3.修改一个字符。

字符串长度满足 1≤n≤1000 ,保证字符串中只出现小写英文字母。

示例 1:

输入:   "nowcoder","new"
返回值: 6
说明:   "nowcoder"=>"newcoder"(将'o'替换为'e'),修改操作1次
        "nowcoder"=>"new"(删除"coder"),删除操作5次

示例 2:

输入:   "intention","execution"
返回值: 5
说明:   一种方案为:
        因为2个长度都是9,后面的4个后缀的长度都为"tion",于是从"inten"到"execu"逐个修改即可

示例 3:

输入:   "now","nowcoder"
返回值: 5

解题代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param str1 string字符串
     * @param str2 string字符串
     * @return int整型
     */
    public int editDistance (String str1, String str2) {
        // write code here
        int[][] dp = new int[2][str2.length() + 1]; //定义动规数组,两行分别表示当前和上一轮的结果,分别为i%2和(i+1)%2

        for (int i = 1; i <= str2.length(); i++) { //初始化
            dp[0][i] = i;
        }
        for (int i = 1; i <= str1.length(); i++) {
            for (int j = 1; j <= str2.length(); j++) {
                if (str1.charAt(i - 1) == str2.charAt(j - 1)) { //第一种情况
                    if (j - 1 == 0) {
                        dp[i % 2][j] = i - 1;
                    } else {
                        dp[i % 2][j] = dp[(i + 1) % 2][j - 1];
                    }

                } else { //第二种情况
                    if (j - 1 == 0) {
                        dp[i % 2][j] = Math.min(dp[(i + 1) % 2][j] + 1, i);
                    } else {
                        dp[i % 2][j] = Math.min(dp[(i + 1) % 2][j] + 1,
                                                Math.min(dp[(i + 1) % 2][j - 1] + 1, dp[i % 2][j - 1] + 1));
                    }

                }
            }
        }
        return dp[str1.length() % 2][str2.length()];
    }
}

0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论