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

来源:互联网 发布:ubuntu 忘记root密码 编辑:程序博客网 时间:2024/05/09 01:44

求一个字符串中连续出现次数最多的子串,但网上大部分没有通过测试的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));}


 

0 0