代码随想录算法训练营第9天,28. 找出字符串中第一个匹配项的下标、459.重复的子字符串

17 篇文章 0 订阅

28. 找出字符串中第一个匹配项的下标459.重复的子字符串

28. 找出字符串中第一个匹配项的下标

对于这道题,我们可以直接去一个个匹配,不用kmp算法,直接对要对比的字符串进行一个一个比较,如果,haystack的长度小于needle的长度,我们直接返回负一;
利用for循环,一个个进行比较即可

暴力解法

class Solution {
public:
    int strStr(string haystack, string needle) {
        int num = -1;
        if(haystack.size()<needle.size())
        return num;
        for(int ii = 0;ii<(haystack.size()+1-needle.size());ii++)
        {
            for(int jj =0;jj<needle.size();jj++)
            {
                if(haystack[jj+ii]!=needle[jj])
                {
                    num = -1;
                    break;
                }
                    num = ii;
            }
            if(num==ii)
            break;
        }
        return num;
    }
};

KMP

KMP的关键在于next数组

class Solution {
public:

    int strStr(string haystack, string needle) {
        if(needle.size()>haystack.size())
        return -1;
//next
        int j =0;
        int next[needle.size()];
        next[0]=0;
        for(int i = 1;i<needle.size();i++)
        {
            while(j>0&&needle[i]!=needle[j])
                j = next[j-1];
            if(needle[i]==needle[j])
                j++;
            next[i]=j;
        }

        j = 0;
        int num = -1;
        for(int i = 0;i<haystack.size();i++)
        {
            while(j>0&&haystack[i]!=needle[j])
                    {
                        j = next[j-1];
                    }
            if(haystack[i]==needle[j])
                j++;
            if(j==needle.size())
                return i-j+1;
        }
        return -1;
    }
};

459.重复的子字符串

我们可以先求出该数组的next数组,如果这个数组是由重复的数组组成,那么这个数组一定存在相等的最长前后缀,因此next数组最后一位一定不为零且,字符串与字串的长度差是字符串的因子,对此我们写出代码

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int next[s.size()];
        next[0] = 0;
        int j = 0;
        for (int i = 1;i<s.size();i++)
        {
            while(j>0&&s[i]!=s[j])
                j=next[j-1];
            if(s[i]==s[j])
            j++;
            next[i]=j;
        }

        int k = s.size()-next[s.size()-1];
        if(s.size()%k||next[s.size()-1]==0)
            return false;
        for(j=0;j<next[s.size()-1];j++)
            if(s[k+j]!=s[j])
            return false;
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值