题解 | #最长重复子串#

最长重复子串

http://www.nowcoder.com/practice/4fe306a84f084c249e4afad5edf889cc

题目描述
一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串。
给定一个字符串,请编写一个函数,返回其最长的重复字符子串。
若不存在任何重复字符子串,则返回0。

方法一:暴力解法

求解思路
对于本题目,我们直到这个重复的子串是小于原字符串的一半的。然后我们对子串进行一一列举,从长度为1的子串一直到长度为原字符串一半长度的子串。继而将列举出来的字符串进行重复判断,即可得到题目的答案 。

图片说明

解题代码

class Solution {
public:
    //对具体的起点与长度,确认字符串是否为重复拼接形式
    bool check(string& a, int alen, int begin) 
    {
        for(int i = begin; i < alen + begin; ++i) 
        {
            if(a[i] != a[i + alen]) 
            {   //这说明字符串肯定不存在重复在其后面,返回false
                return false;
            }
        }
        return true; // 返回ture
    }
    int solve(string a) 
    {
        int n = a.length();
        for(int i = n / 2; i > 0; --i) 
        {   //枚举长度
            for(int j = 0; j <= n - i - i; ++j) 
            {   //枚举起点
                if(check(a, i, j)) 
                {
                    return 2 * i; // 找到重复字符串
                }
            }
        }
        return 0; // 否则返回0,结束程序
    }
};

复杂度分析
时间复杂度:使用了三层循环,因此时间复杂度为O( )
空间复杂度:没有引入新的内存地址空间,因此空间复杂度为

方法二:优化方法

求解思路
对于第一种暴力解法,由于时间复杂度是立方级别,因此方法二对其进行优化。我们对三层循环进行优化,发现当我们对于一个长度为len的子串进行判断时,如果它不是重复子串,那么a[i]和a[i+len]开头的子串的结果是一样的,因此对于一个给定的长度,只需要对字符串进行一次遍历即可,这样使得时间复杂度降低一次方,变成二次方的级别。

图片说明

解题代码

class Solution {
public:
    int solve(string a)
    {
        int n = a.length(), hyres = 0;
        for(int i = n / 2; i > 0; --i)
        {   //枚举长度
            for(int j = 0; j < n - i; ++j)
            {   //枚举起点
                if(a[j] == a[i + j])
                {
                    ++hyres; // 满足判断条件,hyres加一
                }
                else
                {
                    hyres = 0; // 不满足条件则重置长度
                }
                if(hyres == i) return i * 2;
            }
        }
        return 0;
    }
};

复杂度分析
时间复杂度:两层循环,因此时间复杂度为O( )
空间复杂度:没有引入新的内存地址空间,因此空间复杂度为

算法 文章被收录于专栏

算法题的题解以及感受

全部评论

相关推荐

06-23 11:43
门头沟学院 Java
allin校招的烤冷面很爱看电影:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从今天开始狠狠卷JVAV_癫:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务