题解 | #最长公共子串#
最长公共子串
https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac
用到了 动态规划
最终结果是由 下一级结果累计 获取的。
首先需要创建一个 二维数组,大小就是arr[字符串1的长度][字符串2的长度]
这题动态规划的思想就是 如果存在公共子串,比如"1AB2345CD","12345EF"的公共子串2345
那么比如"1AB2345CD"中公共子串2345最后一个 值5的下标是7,对应的"12345EF"公共子串2345最后一个值5的下标是5,两个字符串 5的前一个值4 肯定也是相等的,下标分别是6和4 。 所以可以知道值5 的最大长度是 值4 最大长度+1, 同理,两个字符串 值为3 对应的下标是 5和3 ,值为4的最大长度是值3 最长度+1 ,
也就是说,i代表的是 字符串1的下标、j代表的是字符串2的下标,如果她两字符相等,他们最大公共子串长度是 字符串1下标为i-1 ,字符串2下标为j-1 的最大公共子串长度 +1.
for循环
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) { int[][] data= new int[str1.length()+1][str2.length()+1]; int maxlength =0; int index =0; for(int i = 0;i<str1.length();i++){ for(int j = 0;j<str2.length();j++) { if(str1.charAt(i)!=str2.charAt(j)) { data[i][j] = 0; } else{ if(i==0||j==0){ data[i][j]=1; } else{ data[i][j] = data[i-1][j-1] +1; } if(maxlength <data[i][j]) { maxlength = data[i][j]; index = i; } } } } return str1.substring(index-maxlength+1,index+1); } }