• 代码随想录Day_56打卡


    ①、两个字符串的删除操作

    给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

    每步 可以删除任意一个字符串中的一个字符。

    事例:

    输入: word1 = "sea", word2 = "eat"
    输出: 2
    解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"

    思路:

            使用动态规划,dp定义为:dp[i][j]表示word1从0到i - 1要跟word2从0到j - 1相同的最小删除次数。若word1[i - 1] == word2[j - 1],则此时不需要删除,dp[i][j] = dp[i - 1][j - 1]。若不相同,则需要删除其中一个,若删除word1,则dp变为i - 1与j匹配,dp[i][j] = dp[i - 1][j] + 1,若删除word2,则dp变为i与j - 1匹配,dp[i][j] = dp[i][j - 1] + 1,两者选择最小值即可。

    动态规划:

            dp定义及含义:dp[i][j]表示word1从0到i - 1要跟word2从0到j - 1相同的最小删除次数。

            状态转移方程:if(word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1]

                                    else dp[i][j] = Math.min(dp[i - 1][j] + 1,dp[i][j - 1] + 1)

            初始化:第一行和第一列表示一个字符串到空串需要删除多少次,其实就是删除另一个字符串的长度,dp[i][0] = i , dp[0][j] = j。

            遍历顺序:两个for循环嵌套遍历

            dp[word1.length()][word2.length()]即为答案。

    代码:

    1. public int minDistance(String word1, String word2) {
    2. int[][] dp = new int[word1.length() + 1][word2.length() + 1];
    3. for(int i = 1;i <= word1.length();i++){
    4. dp[i][0] = i;
    5. }
    6. for(int j = 1;j <= word2.length();j++){
    7. dp[0][j] = j;
    8. }
    9. for(int i = 1;i <= word1.length();i++){
    10. for(int j = 1;j <= word2.length();j++){
    11. if(word1.charAt(i - 1) == word2.charAt(j - 1)){
    12. dp[i][j] = dp[i - 1][j - 1];
    13. }else{
    14. dp[i][j] = Math.min(dp[i - 1][j] + 1,dp[i][j - 1] + 1);
    15. }
    16. }
    17. }
    18. return dp[word1.length()][word2.length()];
    19. }

    ②、编辑距离

    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

    你可以对一个单词进行如下三种操作:

    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

    事例:

    输入:word1 = "horse", word2 = "ros"
    输出:3
    解释:
    horse -> rorse (将 'h' 替换为 'r')
    rorse -> rose (删除 'r')
    rose -> ros (删除 'e')

    思路:

            与上一题类似,只是这道题多了插入和替换操作。对于两个字符串,其实存在逆向操作,如:像word1添加一个字符,也可以换为让word2删除一个字符。故不需要考虑只向word1或word2操作,和不需要考虑添加删除操作,只需要考虑删除和替换操作。

    删除与上题一样,替换操作理解成:word1与word2需要替换其中一个字符,则只需要操作一次,在两者的前一个字符中选择一个替换,即dp[i][j] = dp[i - 1][j - 1] + 1。

    动态规划:

            dp定义及含义:dp[i][j]表示word1从0到i - 1要跟word2从0到j - 1相同需要操作多少次。

            状态转移方程:if(word1[i - 1] == word[j - 1]) dp[i][j] = dp[i - 1][j - 1]

                                     else dp[i][j] = Math.min(dp[i - 1][j] + 1,dp[i][j - 1] + 1,dp[i - 1][j - 1] + 1)。

            初始化:dp[i][0] = i,dp[0][j] = j

            遍历顺序:两个for循环嵌套遍历

            dp[word1.length()][word2.length()]即为答案。

    代码:

    1. public int minDistance(String word1, String word2) {
    2. int[][] dp = new int[word1.length() + 1][word2.length() + 1];
    3. for(int i = 1;i <= word1.length();i++){
    4. dp[i][0] = i;
    5. }
    6. for(int j = 1;j <= word2.length();j++){
    7. dp[0][j] = j;
    8. }
    9. for(int i = 1;i <= word1.length();i++){
    10. for(int j = 1;j <= word2.length();j++){
    11. if(word1.charAt(i - 1) == word2.charAt(j - 1)){
    12. dp[i][j] = dp[i - 1][j - 1];
    13. }else{
    14. dp[i][j] = Math.min(dp[i - 1][j] + 1,
    15. Math.min(dp[i][j - 1] + 1,dp[i - 1][j - 1] + 1));
    16. }
    17. }
    18. }
    19. return dp[word1.length()][word2.length()];
    20. }

    参考:代码随想录 (programmercarl.com)

  • 相关阅读:
    Python基础总结(一)
    MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
    华为OD机试 - 事件推送(Java 2023 B卷 100分)
    Java 设计模式之工厂模式与单例模式
    #13Maven打包生成MD5校验文件的两种方式
    【MySQL】数据库的约束
    论文阅读——ELECTRA
    vsc连接wsl安装vsc时遇到权限问题的解决方案
    【SpringBoot】8.SpringBoot中的异步任务
    小程序中如何设置所服务地区的时区
  • 原文地址:https://blog.csdn.net/kk_try_hard/article/details/132744858