leetcode459. 重复的子字符串(KMP)

一:题目

在这里插入图片描述

二:上码


class Solution {
public:
    /**
        思路:
                a b c a b c a b c a b  c
        next[i] 0 0 0 1 2 3 4 5 6 7 8  9
             i  0 1 2 3 4 5 6 7 8 9 10 11   
        length:12
        next[length-1]:next[11] = 9

        length - next[length-1] = 3;//求出我们的单个字符串

        如果length % (length - next[length-1]) == 0 那么的话 我们就可以确定我们有多少个字符串。
    
    */
    
    //求出前缀表
    void getIndex(int *next,string s) {
        int j = 0;//前缀表的末尾
        next[0] = 0;//只有一个字符的

        for (int i = 1; i < s.size(); i++) {//i是后缀表的末尾

            while (j > 0 && s[i] != s[j]) {//处理字符不一致的问题
                j = next[j-1];            //找前一个元素对应的最长公共前后缀 作为其下标 再进行匹配    
            }
            if (s[i] == s[j]) j++;
            next[i] = j;//处理子串对应的最长公共前后缀
        }
    }

    bool repeatedSubstringPattern(string s) {
        
        if (s.size() == 0) return false;

        int next[s.size()];
        getIndex(next,s);
        int length = s.size();

        //保证我们的包含最后一个元素的子串是有最长公共前后缀的
        //

        if ( next[length-1] != 0 && length % (length - next[length-1]) == 0) {
            return true;
        }

        return false;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值