题解 | #牛群编号变更# 最长公共子序列 LCS

牛群编号变更

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

知识点

最长公共子序列 LCS

DP

思路

两个序列的公共子序列部分是不需要更改的,剩下的则需要增加或者减少,所以只需要求出最长公共子序列,每个序列除去最长公共子序列的部分就是需要更改的部分。

定义 f[i][j]表示word1前i个字母和word2的前j个字母的最长公共子序列。

时间复杂度 O(n^2)

AC Code (C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param word1 string字符串 
     * @param word2 string字符串 
     * @return int整型
     */
    int minDistance(string word1, string word2) {
        // 求lcs
        int n = word1.size(), m = word2.size();
        int f[n + 1][m + 1];
        memset(f, 0, sizeof f);
        f[0][0] = 0;
        int res = 0;
        for (int i = 1; i <= n; i ++) {
            for (int j = 1; j <= m; j ++) {
                f[i][j] = max(f[i - 1][j], f[i][j - 1]);
                if (word1[i - 1] == word2[j - 1]) f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
            }
        }
        return n + m - 2 * f[n][m];
    }
};

全部评论

相关推荐

09-14 17:23
门头沟学院
故事和酒66:所以说副业很重要,程序员干到40岁,再怎么也赚300万了,吃吃利息也够活下去
点赞 评论 收藏
分享
爱睡觉的冰箱哥:你是我今晚见过的最美的牛客女孩
点赞 评论 收藏
分享
头像
09-19 19:21
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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