题目
思路的视频链接在这里
思路大概是这样:
状态转移方程为
注意:
- new int的初始值为0,不用专门初始化
- 下标是从1开始的
import java.util.*;
public class Solution {
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
public String LCS (String str1, String str2) {
// write code here
int[][] lcs = new int[str1.length() + 1][str2.length() + 1];
// lcs[i][j] 代表以str1[i],str2[j]结尾的最长公共子串的长度
int max = 0;
int index = 0;
for(int i = 1; i <= str1.length(); i++){
for(int j = 1; j <= str2.length(); j++){
if(str1.charAt(i - 1) == str2.charAt(j - 1)){
lcs[i][j] = lcs[i - 1][j - 1] + 1;
if(lcs[i][j] > max){
max = lcs[i][j]; // 更新最长公共子串的长度
index = i; // i表示最长公共子串中的最后一个字母的下标,即末尾下标
}
}
}
}
return str1.substring(index - max, index); // 下标减去长度就是起始下标
}
}