描述

给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。

示例1

输入:
“1AB2345CD”,”12345EF”

返回值:
“2345”

  1. import java.util.*;
  2. public class Solution {
  3. /**
  4. * longest common substring
  5. * @param str1 string字符串 the string
  6. * @param str2 string字符串 the string
  7. * @return string字符串
  8. */
  9. public String LCS (String str1, String str2) {
  10. //记录最长公共子串的长度
  11. int maxLength = 0;
  12. //记录最长公共子串最后一个元素在字符串str1中的位置
  13. int maxLastIndex = 0;
  14. int[][] dp = new int[str1.length() + 1][str2.length() + 1];
  15. for(int i=0; i<str1.length(); i++){
  16. for(int j = 0; j < str2.length(); j++){
  17. //递推公式,两个字符相等的情况
  18. if(str1.charAt(i) == str2.charAt(j)){
  19. dp[i+1][j+1] = dp[i][j] + 1;
  20. //如果遇到了更长的子串,要更新,记录最长子串的长度,
  21. //以及最长子串最后一个元素的位置
  22. if(dp[i+1][j+1] > maxLength){
  23. maxLength = dp[i+1][j+1];
  24. maxLastIndex = i;
  25. }
  26. } else{
  27. //递推公式,两个字符不相等的情况
  28. dp[i+1][j+1] = 0;
  29. }
  30. }
  31. }
  32. //最字符串进行截取,substring(a,b)中a和b分别表示截取的开始和结束位置
  33. return str1.substring(maxLastIndex-maxLength+1,maxLastIndex +1);
  34. }
  35. }