题解 | #牛群编号变更#

牛群编号变更

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

考察的知识点:动态规划;

解答方法分析:

  1. 定义一个二维数组dp,其中dp[i][j]表示将s1的前i个字符变更为s2的前j个字符所需的最少操作次数。
  2. 初始化dp数组的第一行和第一列,即dp[0][j]和dp[i][0],对应于将空字符串变更为s2的前j个字符和将s1的前i个字符变更为空字符串,所需的操作次数就是对应的字符数量。
  3. 从s1的第一个字符开始遍历到末尾,对于每个字符s1[i],再从s2的第一个字符遍历到末尾,对于每个字符s2[j],分为以下几种情况:如果s1[i]等于s2[j],即当前字符相等,那么不需要进行任何操作,dp[i][j]等于dp[i-1][j-1],即前一个字符的操作次数。如果s1[i]不等于s2[j],即当前字符不相等,可以考虑进行删除操作或者插入操作:a) 删除操作:将s1的前i个字符删除一个字符,即dp[i][j]等于dp[i-1][j]+1,表示删除s1的第i个字符。b) 插入操作:在s1的第i个字符后面插入一个字符,使得s1的前i+1个字符等于s2的前j个字符,即dp[i][j]等于dp[i][j-1]+1,表示插入s2的第j个字符。
  4. dp[s1.length()][s2.length()]的值即是所需的最少操作次数。

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param word1 string字符串
     * @param word2 string字符串
     * @return int整型
     */
    int minDistance(string word1, string word2) {
        int m = word1.length();
        int n = word2.length();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        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[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
                }
            }
        }
        return dp[m][n];
    }
};

全部评论

相关推荐

会非的杨:吓死了,看到我的评论以为自己被网暴了,那哥们说白了就是吃了黑流量还要倒打一耙喷他的,自己都说了想吃黑流量,然后又说网友不友好,md这不左右脑互搏吗,拿个蓝桥杯省二说要冲大厂,起号和父母不能同时存在
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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