题解 | #最长公共子串#
最长公共子串
http://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac
index和maxLength是参考了其他大佬的操作,以及返回的str1.substring(index-maxLength+1,index+1);
这里的循环其实可以从dp[0][0]开始,需要判断i==0||j==0,单独弄出来处理会比较更容易明白吧(对我而言)
题目保证str1和str2的最长公共子串存在且唯一。
所以这里没有处理临界值(是否为空字符串),要处理的话用一个 if(str==null || str.equals(" "))判断应该就行了。
附上图片以助理解:
代码:
public String LCS (String str1, String str2) { // write code here int [][]dp=new int[str1.length()][str2.length()]; //根据字符串长度创建二维数组 int maxLength=0; //长度 int index = 0;//下标 // 处理边界条件 i=0 || j=0 for(int i=0;i<str1.length();i++){ if(str1.charAt(i)==str2.charAt(0)){dp[i][0]=1; maxLength=dp[i][0]; index=i; } else{ dp[i][0]=0; } } for(int i=0;i<str2.length();i++){ if(str1.charAt(0)==str2.charAt(i)){dp[0][i]=1; maxLength=dp[0][i];index=i;} else{ dp[0][i]=0; } } //从dp[1][1]开始循环 for(int i=1;i<str1.length();i++){ for(int j=1;j<str2.length();j++){ if(str1.charAt(i)==str2.charAt(j)){ dp[i][j]=dp[i-1][j-1]+1; if(maxLength<=dp[i][j]){ maxLength=dp[i][j];index=i;} }else{ dp[i][j]=0; } } } return str1.substring(index-maxLength+1,index+1);