大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的是字符串的处理和动态规划(DP)算法。

题目解答方法的文字分析

我们需要将字符串 s1 变更为字符串 s2,可以使用两种操作:插入一个字符和删除一个字符。我们的目标是找到最少的操作次数。

这是一个典型的动态规划问题。我们可以使用动态规划来解决这个问题。首先,我们定义一个二维的 DP 数组 dp,其中 dp[i][j] 表示将 s1 的前 i 个字符变更为 s2 的前 j 个字符所需的最少操作次数。

接下来,我们来考虑动态规划的转移方程。我们可以根据 s1 的第 i 个字符和 s2 的第 j 个字符来判断是否需要进行操作。如果 s1 的第 i 个字符等于 s2 的第 j 个字符,则说明不需要进行操作,即 dp[i][j] = dp[i-1][j-1]。如果 s1 的第 i 个字符不等于 s2 的第 j 个字符,则说明需要进行操作,我们可以选择插入一个字符或删除一个字符,取两种操作方式的最小值,并加上当前操作的代价,即 dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + 1。

最后,我们需要初始化 DP 数组的边界条件。当 s1 为空时,将 s1 变更为空字符串需要删除 s2 的所有字符,操作次数为 s2 的长度;当 s2 为空时,将 s1 变更为为空字符串需要插入 s1 的所有字符,操作次数为 s1 的长度。

本题解析所用的编程语言

C++

完整且正确的编程代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param word1 string字符串 
     * @param word2 string字符串 
     * @return int整型
     */
    int minDistance(string word1, string word2) {
        int n1 = word1.length();
        int n2 = word2.length();

        // 定义二维 DP 数组
        vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1, 0));

        // 初始化边界条件
        for (int i = 0; i <= n1; ++i) {
            dp[i][0] = i; // 将 s1 变更为空字符串需要删除 s1 的所有字符
        }

        for (int j = 0; j <= n2; ++j) {
            dp[0][j] = j; // 将 s1 变更为空字符串需要插入 s1 的所有字符
        }

        // 动态规划递推
        for (int i = 1; i <= n1; ++i) {
            for (int j = 1; j <= n2; ++j) {
                if (word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1]; // 字符相同,不需要操作
                } else {
                    // 字符不同,需要选择插入或删除操作的最小值,并加上当前操作的代价
                    dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + 1;
                }
            }
        }

        return dp[n1][n2];
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!