【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 。
【9.28】刷题_第1张图片

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 由小写英文字母组成
【9.28】刷题_第2张图片

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]的初始化问题(卡了好久

你可能感兴趣的:(leetcode,学习日记,leetcode,算法,职场和发展)