• 【9.28】刷题


    动规

    1143. 最长公共子序列

    给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

    一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

    例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
    两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

    示例 1:

    输入:text1 = “abcde”, text2 = “ace”
    输出:3
    解释:最长公共子序列是 “ace” ,它的长度为 3 。
    示例 2:

    输入:text1 = “abc”, text2 = “abc”
    输出:3
    解释:最长公共子序列是 “abc” ,它的长度为 3 。
    示例 3:

    输入:text1 = “abc”, text2 = “def”
    输出:0
    解释:两个字符串没有公共子序列,返回 0 。
    在这里插入图片描述

    class Solution {
        public int longestCommonSubsequence(String text1, String text2) {
        int[] f = new int[text2.length()+1];
        int result = 0;
        int pre = 0;//i-1 j-1
        for(int i = 1 ; i <= text1.length() ; i++){
            for(int j = 1 ; j<=text2.length() ; j++){
                int temp = f[j];
                f[j] = text1.charAt(i-1) == text2.charAt(j-1)? pre+1 : Math.max(f[j-1],f[j]);
                result = Math.max(f[j],result);
                pre = temp;
            }
            pre = 0;
        }
        return result;
        }
    }
    

    72. 编辑距离

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

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

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

    示例 1:

    输入:word1 = “horse”, word2 = “ros”
    输出:3
    解释:
    horse -> rorse (将 ‘h’ 替换为 ‘r’)
    rorse -> rose (删除 ‘r’)
    rose -> ros (删除 ‘e’)
    示例 2:

    输入:word1 = “intention”, word2 = “execution”
    输出:5
    解释:
    intention -> inention (删除 ‘t’)
    inention -> enention (将 ‘i’ 替换为 ‘e’)
    enention -> exention (将 ‘n’ 替换为 ‘x’)
    exention -> exection (将 ‘n’ 替换为 ‘c’)
    exection -> execution (插入 ‘u’)

    提示:

    0 <= word1.length, word2.length <= 500
    word1 和 word2 由小写英文字母组成
    在这里插入图片描述

    class Solution {
        public int minDistance(String word1, String word2) {
            int[] f = new int[word2.length()+1];
            int pre = 0;
            for(int j = 1;j<=word2.length();j++){
                f[j] = j;
            }
            for(int i = 1; i<=word1.length(); i++){     
                f[0]=i;
                for(int j = 1; j<= word2.length();j++){//f[j-1]:f[i][j-1] f[j]:f[i-1][j]
                    int temp = f[j];
                    f[j] = word1.charAt(i-1)==word2.charAt(j-1)?pre:(Math.min(Math.min(f[j-1],f[j]),pre)+1);
                    pre = temp;//f[i-1][j-1]
                }
                pre = i;
            } 
            return f[word2.length()];
        }
    
    }
    

    两道题都用滚动数组把二维降低到一维,第二题需要注意f[j-1]的初始化问题(卡了好久

  • 相关阅读:
    SpringBoot源码学习4——SpringBoot内嵌Tomcat启动流程源码分析
    【C语言】实现通讯录管理系统
    练习7-在Verilog中使用任务task
    js 继承内置类型 之 洗牌算法
    Android11修改自动允许连接到建议的WLAN网络
    C++漫游记 (2):C++比较两个map是否相同
    LVM逻辑卷管理的知识总结和操作说明
    揭秘亚马逊、ebay自养号测评底层环境防关联技术
    Sass 使用说明
    PHP7 +nginx Docker 部署
  • 原文地址:https://blog.csdn.net/minatosan/article/details/127087176