最大公共子串
最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:“abckkk”和“baabcdadabc”,
可以找到的最长的公共子串是“abcd”,所以最大公共子串长度为4.
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该揭发的思路,并补全划线部分缺失的代码。
public class Main {
static int f(String s1,String s2){
char[] c1=s1.toCharArray();
char[] c2=s1.toCharArray();
int[][]a=new int[c1.length+1][c2.length+1];
int max=0;
for(int i=1;i<a.length;i++){
for(int j=1;j<a[i].length;j++){
if(c1[i-1]==c2[j-1]){
a[i][j]=___________;//填空
if(a[i][j]>max) max=a[i][j];
}
}
}
return max;
}
public static void main(String[] args) {
int n=f("abcdkkk","baabcdadabc");
System.out.println(n);
}
}
================================================================================================
代码:
package PastExam2017;
/**
@author DengMingxu
20212021年3月29日
State:unsolved
Hint:最大公共子串
最大公共子串长度问题就是:
求两个串的所有子串中能够匹配上的最大长度是多少。
比如:“abckkk”和“baabcdadabc”,
可以找到的最长的公共子串是“abcd”,所以最大公共子串长度为4.
下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。
请分析该揭发的思路,并补全划线部分缺失的代码。
public class Main {
static int f(String s1,String s2){
char[] c1=s1.toCharArray();
char[] c2=s1.toCharArray();
int[][]a=new int[c1.length+1][c2.length+1];
int max=0;
for(int i=1;i<a.length;i++){
for(int j=1;j<a[i].length;j++){
if(c1[i-1]==c2[j-1]){
a[i][j]=___________;//填空
if(a[i][j]>max) max=a[i][j];
}
}
}
return max;
}
public static void main(String[] args) {
int n=f("abcdkkk","baabcdadabc");
System.out.println(n);
}
}
Idea:
1.矩阵法、动态规划
2.
*/
public class LongestCommonSubstring {
static int f(String s1,String s2){
char[] c1=s1.toCharArray();
char[] c2=s1.toCharArray();
int[][] a=new int[c1.length+1][c2.length+1];
int max=0;
for(int i=1;i<a.length;i++){
for(int j=1;j<a[i].length;j++){
if(c1[i-1]==c2[j-1]){
a[i][j]=a[i-1][j-1]+1;//填空
if(a[i][j]>max) max=a[i][j];
}
}
}
return max;
}
public static void main(String[] args) {
int n=f("baabcdadabc","baabcdadabc");
System.out.println(n);
}
}

本文介绍了一种利用动态规划的矩阵法来解决最大公共子串问题的算法。通过创建一个二维数组,存储两个字符串对应位置的字符是否相等的信息,如果相等,则在矩阵中存储前一位置的公共子串长度加1,从而找到最长公共子串的长度。例如,对于字符串'abckkk'和'baabcdadabc',最长公共子串为'abcd',长度为4。
713

被折叠的 条评论
为什么被折叠?



