题解 | #牛群编号变更# Java

牛群编号变更

https://www.nowcoder.com/practice/9295f0f796b34793832710d5c939a619

`编辑距离`原题简化版 这题还可以是 `插入`、`删除`、`修改`三个操作,还可以把每个操作赋予一个代价,求最少操作代价

dp[i][j]表示将字符串word1的前i个字符变为字符串word2的前j个字符所需的最少操作次数。

我们需要初始化dp数组的边界条件。当word1为空串时,也就是i=0时,dp[0][j]等于j,表示将空串变为word2的前j个字符需要插入j个字符。同理,当word2为空串时,也就是j=0时,dp[i][0]等于i,表示将word1的前i个字符变为空串需要删除i个字符。

通过递推关系式来更新dp数组的其他位置。对于dp[i][j],如果word1的第i个字符等于word2的第j个字符,说明不需要进行操作,此时可以继续判断dp[i-1][j-1],即dp[i][j] = dp[i-1][j-1]。如果word1的第i个字符不等于word2的第j个字符,说明需要进行操作,然后可以选择插入字符、删除字符中的一种操作,即dp[i][j] = Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);

import java.util.*;


public class Solution {

    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();

        int[][] dp = new int[m + 1][n + 1];

        for (int i = 0; i <= m; i++) {
            dp[i][0] = i;
        }

        for (int j = 0; j <= n; j++) {
            dp[0][j] = j;
        }

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1);
                }
            }
        }

        return dp[m][n];
    }
}

算法题刷刷刷 文章被收录于专栏

数组、链表、栈、队列、堆、树、图等。 查找和排序:二分查找、线性查找、快速排序、归并排序、堆排序等。 动态规划:背包问题、最长公共子序列、最短路径 贪心算法:活动选择、霍夫曼编码 图:深度优先搜索、广度优先搜索、拓扑排序、最短路径算法(如 Dijkstra、Floyd-Warshall) 字符串操作:KMP 算法、正则表达式匹配 回溯算法:八皇后问题、0-1 背包问题 分治算法:归并排序、快速排序

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务