日期:2014-05-20  浏览次数:20755 次

求一个串中出现的的第一个最长重复子串
求一个串中出现的的第一个最长重复子串
public class J{
public static void main(String[] args) {
String str="abbdabcdabcxkkkkkk";  
J j=new J();
j.find(str);
}
public void find(String s){
char arry[]=s.toCharArray();
int index=0,length=0,length1,i=0,k,j;
while(i<arry.length){
j=i+1;
while(j<arry.length){
if(arry[i]==arry[j]){
length1=1;
for(k=1;arry[i+k]==arry[j+k];k++)//查找有多少个相同的
length1++;
if(length1>length){//确定是最长子串
index=i;
length=length1;
}
j+=length1;
}
else
j++;
}
i++;
}
for(int m=0;m<length;m++){
System.out.print(""+arry[index+m]);
}
}
}
运行时报错
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
at J.find(J.java:15)
at J.main(J.java:5)

------解决方案--------------------
lz 参考这里 大牛们给出了简洁高效的算法。。

http://topic.csdn.net/u/20120423/11/dbd47ed4-f59f-469a-8ffc-1126cc02fa4d.html
------解决方案--------------------
at J.find(J.java:15)
报越界了 ,单步调试一下
------解决方案--------------------
程序报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
是因为数组下标溢出而报的错,在程序第15行for(k=1;arry[i+k]==arry[j+k];k++)语句中当j+k>=arry.length时arry数组下标越界而报错。arry数组的下标只能小于arry.length。修改后程序为:

public class J {
public static void main(String[] args) {
String str = "abbdabcdabcxkkkkkk";
J j = new J();
j.find(str);
}

public void find(String s) {
char arry[] = s.toCharArray();
int index = 0, length = 0, length1, i = 0, k, j;
while (i < arry.length) {
j = i + 1;
while (j < arry.length) {
if (arry[i] == arry[j]) {
length1 = 1;
for (k = 1; j+k<arry.length; k++)
if(arry[i + k] == arry[j + k]){
length1++;
}
// 查找有多少个相同的
if (length1 > length) {// 确定是最长子串
index = i;
length = length1;
}
j += length1;
} else
j++;
}
i++;
}
for (int m = 0; m < length; m++) {
System.out.print("" + arry[index + m]);
}
}
}
------解决方案--------------------
没有明白你的意思是要输出什么
------解决方案--------------------
可以改成:for (k = 1;j + k<arry.length && arry[i + k] == arry[j + k]; k++)length1++;
------解决方案--------------------
public class J {
public static void main(String[] args) {
String str = "abbdabcdabcxkkkkkk";
J j = new J();
j.find(str);
}

public void find(String s) {
char arry[] = s.toCharArray();
int index = 0, length = 0, length1, i = 0, k, j;
while (i < arry.length) {
j = i + 1;
while (j < arry.length) {
if (arry[i] == arry[j]) {
length1 = 1;
for (k = 1; j + k < arry.length; k++){
if (arry[i + k] == arry[j + k]) { 
length1++;
}
else // 如果比较过程中,第一次出现不相等的就结束整个循环 否则就会一直往后比较了
break;
}
// 查找有多少个相同的

if (length1 > length) {// 确定是最长子串
index = i;
length = length1;
}
j += length1;
} else
j++;
}
i++;
}
for (int m = 0; m < length; m++) {
System.out.print("" + arry[index + m]);
}
}
}
如果出现连续的就不行了,上面限制不了这个条件,你想想看有没有什么办法 比如kkkkkk