给定两个字符串 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;
}
}
给你两个单词 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]的初始化问题(卡了好久