java求最大公共子串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java求最大公共子串相关的知识,希望对你有一定的参考价值。

public class StringCompare
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub

String a = "abcdefghijklmn";
String b = "bcdfghijlmna";
String c;
String d = " ";
String e;

int i,j;
boolean x = false;

System.out.println(a);
System.out.println(b);

for(i=0;i<b.length();i++)
if(b.length()-i>d.length())
for(j=b.length()-1;j>0;j--)
c = b.substring(i,j);
while(!x)
e = a.substring(i,j);
x = e.equals(c);
j++;
if(j==a.length()) break;
i++;

if(x)
d = a.substring(i,j);
break;



else
break;

System.out.println(d);



运行后结果是:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 13
at java.lang.String.substring(String.java:1935)
at StringCompare.main(StringCompare.java:24)

不知道这是什么错误。。

二楼改的
c = b.substring(i,j-1);
之后下标越界没了。

程序无法出结果,中间有死循环。当while语句执行完之后j是a.length();然后是执行内循环for语句for(j=b.length()-1;j>0;j--) 此时只比较J>0;。。。。好像是个死循环。最内层的循环可以在加一个int k来控制。多次运行导致cpu上升至100%的。

提供一种矩阵算法,这是LCS的一种算法:
public class stringCompare

/**求最长匹配子字符串算法
str数组记录每行生成的最大值strmax
max数组记录str数组最大时所处的列号nummaxj
最大子字符串为substring(nummax-strmax+1,strmax+1)
*/

public static void main(String[] args)
String s1="asdfgxxcvasdfgc";
String s2="asdfxxcv";
int m=s1.length();
int n=s2.length();
int k=0;
int nummax=0;
int []str=new int[m];
int []max=new int[m];
int []num=new int[m];

for(int i=0;i<m;i++) //生成矩阵数组
for(int j=n-1;j>=0;j--)

if(s1.charAt(i)==s2.charAt(j))

if(i==0||j==0)

num[j]=1;
max[i]=j;
str[i]=1;

else

num[j]=num[j-1]+1;
if(max[i]<num[j])

max[i]=j;
str[i]=num[j];


else
num[j]=0;


for(k=0;k<m;k++) //求str数组的最大值

if(nummax<str[k])

nummax=str[k];



for(k=0;k<m;k++)
if(nummax==str[k])
System.out.println(s2.substring(max[k]-str[k]+1,max[k]+1));

参考技术A 实际上求最大子串就从一个串中进行截取,之后去另外一个串中进行比较,找到最大的串即可:
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
Main mainObj = new Main();
int len = mainObj.getCommonStrLength(sc.next(),sc.next());
System.out.println(len);


int getCommonStrLength(String str1, String str2)
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
int len1 = str1.length();
int len2 = str2.length();
String min = null;
String max = null;
String target = null;
min = len1 <= len2 ? str1 : str2;
max = len1 > len2 ? str1 : str2;
//最外层:min子串的长度,从最大长度开始
for (int i = min.length(); i >= 1; i--)
//遍历长度为i的min子串,从0开始
for (int j = 0; j <= min.length() - i; j++)
target = min.substring(j, j + i);
//遍历长度为i的max子串,判断是否与target子串相同,从0开始
for (int k = 0; k <= max.length() - i; k++)
if (max.substring(k,k + i).equals(target))
return i;




return 0;

参考技术B 二楼。。。我对你改程序的效率表示佩服的有如滔滔江水连绵不绝。。。
不过因为没有注释和思想,花了不少时间没看懂楼主的程序到底想用什么方法求解。。。真的没看懂每步要干什么。。但是for循环里真的最好别该i j的值。。非常危险的我从来没干过。。
作为弥补,我于是写了一个求解的方法,没想到一次过了,happy~留给楼主参考吧。。再说下,给人看的时候最好写上注释或思想,要不生看程序很难看懂的。。像我这样生看过那么多程序的人。。再就是for里的循环变量啊。。千万别改。。
public class StringCompare
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub

String a = "abcdefghijklmn";
String b = "bcdfghijlmna";
String c;
//思想是看b中所有的子串(从长到短)是否在a中出现。
//如果出现判断。。。。
//求b中长度为i的字串。
if(b.length()>a.length())
String temp = a;
a = b;
b = temp;
int n = b.length();
for(int i =n-1 ; i > 0; i--)
for(int j = 0; j < n-i; j++)//舍掉前j个
c = b.substring(j,j+i);
//检验c是否在a中出现。
for(int k = 0; k < a.length()-i; k++)
if(a.substring(k,k+i).equals(c))
System.out.println(i);
System.out.println(c);
return;





参考技术C public class StringCompare
/**
* @param args
*/
public static void main(String[] args)
// TODO Auto-generated method stub

String a = "abcdefghijklmn";
String b = "bcdfghijlmna";
String c;
String d = " ";
String e;

int i,j;
boolean x = false;

System.out.println(a);
System.out.println(b);

for(i=0;i<b.length();i++)
if(b.length()-i>d.length())
for(j=b.length()-1;j>0;j--)
c = b.substring(i,j-1);
while(!x)
e = a.substring(i,j);
x = e.equals(c);
j++;
if(j==a.length()) break;
i++;

if(x)
d = a.substring(i,j);
break;



else
break;

System.out.println(d);


这就行了,自己好好看看有什么差异,然后好好思考一下,对学习有帮助的
参考技术D 数组下标越界

以上是关于java求最大公共子串的主要内容,如果未能解决你的问题,请参考以下文章

求最大公共子串长度

求两个字符串的最大公共子串

求两个输入的字符串的最长公共子串

第八届蓝桥杯b组java第六题

求两个字符串的公共子串的最大长度

动态规划求两字符串连续最大公共子串长度