算法练习:求字符串的最长重复子串(Java实现)

1. 求字符串的最长重复子串

例如:aaaaaaaaabbbbcccaaassscvvv这里面的最长重复子串为aaaaaaaaa

算法思路:算法时间复杂度(O(n))

1. 将这一个字符串先转成char数组;

2. 将这一char数组进行遍历

3. 比较char数组中第i-1个与第i个的字符是否相等,如果不相等则进行截取字符串长度,然后将其进行比较,如果其长度比现有长度大,则进行替换,否则什么也不做

算法实现:(Java实现)

    private static String reSubStr(String str){
        /**
         * 设置变量
         * start:开始
         * end:结束
         * maxStart:最长子串开始位置
         * maxEnd:最长子串结束位置
         */
        int start=0,end=1,maxStart=0,maxEnd=1;
        char[] chars = str.toCharArray();
        for (int i = 1; i < chars.length; i++) {
            //判断如果不相等,则计算器长度
            if(chars[i-1]!=chars[i]) {          //设置其重复子串结束位置
                end=i;
                //子串长度
                int len = end - start;
                //子串长度大于现有的最大子串长度
                if (len > (maxEnd - maxStart)) {
                    //则进行赋值
                    maxStart = start;
                    maxEnd = end;
                }
                //开始截取位置为end结束位置
                start = end;
            }
        }
        //截取字符串
        return str.substring(maxStart,maxEnd);
    }

  

原文地址:https://www.cnblogs.com/lonecloud/p/9281875.html

时间: 2024-10-09 07:34:09

算法练习:求字符串的最长重复子串(Java实现)的相关文章

字符串中连续出现最多的子串 &amp; 字符串中最长重复子串

字符串中连续出现最多的子串 & 字符串中最长重复子串 字符串中连续出现最多的子串 & 字符串中最长重复子串,这两个问题都可以用后缀数组来表示,至于后缀数组可以参考编程珠玑P156:后缀数组就是定义一个数组指针,分别指向字符串中的对应位置,如下: a b c a b c a b c d e .substr[0] b c a b c a b c d e ....substr[1] c a b c a b c d e .......substr[2] a b c a b c d e ......

自己写的一个后缀树算法查找一个字符串的最长重复子串

在上个星期面试一家公司的笔试题上面的最后一道题就是写程序查找一个字符串的最长重复子串.当时想了很长时间没想出什么好方法,就把一个算法复杂度比较高的算法写上去了.回来上机把那个算法写了一遍测试没问题,然后自己又到网上面查查还有什么方法,然后发现好像有种叫做后缀树的方法,然后看那个方法,当时没给出代码,看图看了老半天加之自己想了好几个小时终于知道后缀树是个什么东西.然后自己萌生了一个自己写一个后缀树算法解决那个重复子串的问题.然后写了一天终于写出来了.后续有做了一些测试,发现自己写的一个只有几十个字

求字符串的最长公共子串

找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 代码如下: package string; import java.util.ArrayList; import java.util.List; public class Main { // 求最长公共子串长度 public int getMaxLen(String s1, String s2){ if(s1 == null || s2 == null){ return 0; } int m = s1

求两个字符串的最长公共子串——Java实现

要求:求两个字符串的最长公共子串,如"abcdefg"和"adefgwgeweg"的最长公共子串为"defg"(子串必须是连续的) public class Main03{ // 求解两个字符号的最长公共子串 public static String maxSubstring(String strOne, String strTwo){ // 参数检查 if(strOne==null || strTwo == null){ return null

字符串的最长重复子串(转)

给定一个字符串,输出最长的重复子串 举例:ask not what your country can do for you,but what youcan do for your country 最长的重复子串:can do for you 思路:使用后缀数组解决 分析: 1.由于要求最长公共子序列,则需要找到字符串的所有子串,即通过产生字符串的后缀数组实现. 2.由于要求最长的重复子串,则需要对所有子串进行排序,这样可以把相同的字符串排在一起. 3.比较相邻字符串,找出两个子串中,相同的字符的

后缀数组求解字符串的最长重复子串

后缀数组 给定一个字符串,求出其最长的重复子串. 思路:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分.这样的时间复杂度为: 生成后缀数组 O(N)排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N)依次检测相邻的两个字符串 O(N * N)总的时间复杂度是 O(N^2*logN),

POJ - 1743 Musical Theme (后缀数组求不可重叠最长重复子串)

Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the piano. It is unfortunate but true that this representation of melodies ignores the notion of music

DS串应用—最长重复子串

题目描述 求串的最长重复子串长度(子串不重叠).例如:abcaefabcabc的最长重复子串是串abca,长度为4. 输入 测试次数t t个测试串 输出 对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1. 样例输入 3 abcaefabcabc szu0123szu szuabcefg 样例输出 4 3 -1 提示 #include<iostream> #include<string> using namespace std; int *getnext(string p

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一