//---------------------最长公共子序列----------------------
public static int longestCommonSubsequence(String text1, String text2) {
int m = text1.length();
int n = text2.length();
//dp[i][j]表示的是,test1的前i个字符和test2的前j个字符的最大公共子序列
//防止出现边界问题,所以字符串前面都相当与加一个0
int[][] dp = new int[m+1][n+1];
for(int i = 0; i < m+1; i++){
dp[i][0] = 0;
}
for(int i = 0; i < n+1; i++){
dp[0][i] = 0;
}
//dp[i][0]和dp[0][j]已经初始化了,以下从1开始遍历
//遍历过程中,注意,虽然遍历的从1开始,但是字符串是从0开始的
//所以要注意:text1.charAt(i-1) == text2.charAt(j-1)
for(int i = 1; i < m+1; i++){
for(int j = 1; j < n+1; j++){
if(text1.charAt(i-1) == text2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[m][n];
}
//---------------------最长公共子串----------------------
public static int longestCommonString(String text1, String text2) {
int m = text1.length();
int n = text2.length();
int max = 0;
//dp[i][j]表示的是,test1的前i个字符和test2的前j个字符的最大公共子串
int[][] dp = new int[m][n];
for(int i = 0; i < m; i++){
if(text1.charAt(i) == text2.charAt(0)){
dp[i][0] = 1;
}
}
for(int i = 0; i < n; i++){
if(text1.charAt(0) == text2.charAt(i)){
dp[0][i] = 1;
}
}
//dp[i][0]和dp[0][j]已经初始化了,以下从1开始遍历
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(text1.charAt(i) == text2.charAt(j)){
dp[i][j] = dp[i-1][j-1] + 1;
max = Math.max(max,dp[i][j]);
}
}
}
return max;
}
Leetcode1143最长公共子序列LCS和最长公共子串
最新推荐文章于 2022-10-24 11:24:18 发布