问题:有两个字符串str和str2,求出两个字符串中最长公共子串长度。
比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
方案:
如果字符相同则置为1,否则置为0
减少重复计算,arr[i] [j] = arr[i-1] [j-1],此处要注意的点是当i==0 || j==0时要直接设值。
Java代码实现:
// 动态规划实现,时间复杂度O(m*n),空间复杂度(m*n)
private static String getLcs(String s1, String s2) {
int maxLen = 0, maxEnd = 0;
int[][] arr = new int[s1.length()][s2.length()];
for (int i = 0; i < s1.length(); i++) {
for (int j = 0; j < s2.length(); j++) {
if (s1.charAt(i) == s2.charAt(j)) {
if (i == 0 || j == 0) {
arr[i][j] = 1;
} else {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
} else {
arr[i][j] = 0;
}
if (arr[i][j] > maxLen) {
maxEnd = i;
maxLen = arr[i][j];
}
}
}
if (maxLen == 0) {
return "";
}
return s1.substring(maxEnd - maxLen + 1, maxEnd);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。