您的位置:首页 > 编程语言 > Java开发

一个字符串中连续出现次数最多的子串Java(2)

2014-08-10 10:24 302 查看
求一个字符串中连续出现次数最多的子串,但网上大部分没有通过测试的java代码,其中bug的很多!

下面的java代码绝对可以得到我们想要的结果,并附上详细的介绍。



import java.util.Scanner;

public class StringDeal {

public static void main(String[] args) {
Scanner scann = new Scanner(System.in);
String s = scann.nextLine();

System.out.println(search(s));

scann.close();
}

/**
* 功能:求一个字符串中连续出现次数最多的子串
* @param str
* @return
*/
/*
* 把字符串用后缀树的形式表现出来如下:
* a b c a b c a b c d  .substring[0]
* b c a b c a b c d  ...substring[1]
* c a b c a b c d  .....substring[2]
* a b c a b c d  .......substring[3]
* b c a b c d  .........substring[4]
* c a b c d  ...........substring[5]
* a b c d  .............substring[6]
* b c d  ...............substring[7]
* c d  .................substring[8]
* d  ...................substring[9]
*/
public static String search(String str){
int len = str.length();
int maxCount = 0;
String longest = "";
for(int pos1 = 0; pos1 < len; pos1++)
for(int pos2 = pos1 + 1; pos2 < len && 2*pos2-pos1 <=len; pos2++){
// 保证 2*pos2-pos1 <=len , 不能substring(pos2,2*pos2-pos1)会出现越界
int count = 1;
if(str.substring(pos1,pos2).equals(str.substring(pos2,2*pos2-pos1))){
// str.substring(pos2,2*pos2-pos1)相当于子串substring[pos2]
int offset = pos2-pos1;
count++;
for(int s = pos2 + offset; s < len && s+offset <= len; s += offset){
if(str.substring(pos1,pos1+offset).equals(str.substring(s,s+offset))){
count++;
}else{
break;
}
}
if(count > maxCount){
maxCount = count;
longest = str.substring(pos1,pos1+offset);
}
}
}
return (longest+","+String.valueOf(maxCount));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: