代码随想录算法训练营第九天 | 28. 实现 strStr(),459.重复的子字符串,字符串总结 ,双指针回顾

本文介绍了KMP算法中的strStr()函数实现,以及如何使用next数组进行字符串匹配。同时讨论了重复子字符串的检测方法,利用移动匹配技巧简化查找过程。还提及了字符串处理中的双指针技巧和整体反转策略。
摘要由CSDN通过智能技术生成

Day09

28.实现 strStr()

kmp算法,主要是更新next数组,这里是只需要遍历一遍needle数组就可以,当是s【i'】!=s[j],此时找上一个数的next数组(首先知道next数组存的是这个字符串的前后缀相等的最长子串的后一位),意思是找到除了这个子串差一档的最长子串。

class Solution {
public:
    void getNext(int* next,const string& s){
        int j=-1;
        next[0]=j;
        for(int i=1;i<s.size();i++){
            while(j>-1 && s[i]!=s[j+1]){
                j=next[j];
            }
            if(s[i]==s[j+1]){
                j++;
            }
            next[i]=j;
        }
    }
    int strStr(string haystack, string needle) {
        if(needle.size()==0){
            return 0;
        }
        vector<int> next(needle.size());
        getNext(&next[0],needle);
        int j=-1;
        for(int i=0;i<haystack.size();i++){
            while(j>-1 && haystack[i]!=needle[j+1]){
                j=next[j];
            }
            if(haystack[i]==haystack[j+1]){
                j++;
            }
            if(j+1==needle.size()){
                return (i-needle.size()+1);
            }
        }
        return -1;
    }
};

459.重复的子字符串

移动匹配,变成s+s中寻找一个s。

比较巧妙,重点是判断要能整除。

class Solution {
public:
    void getNext (int* next, const string& s){
        next[0] = -1;
        int j = -1;
        for(int i = 1;i < s.size(); i++){
            while(j >= 0 && s[i] != s[j + 1]) {
                j = next[j];
            }
            if(s[i] == s[j + 1]) {
                j++;
            }
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern (string s) {
        if (s.size() == 0) {
            return false;
        }
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
            return true;
        }
        return false;
    }
};

字符串总结,

反转字符串,可以先整体反转,然后再局部反转    这里就有一个思路:先整体操作(比如去空格那道题)。然后再整体按一个规律加上空格,。尽量可以使一套规则可以应用在全部的操作上。

双指针总结:
一般是一个快指针,一个慢指针,可以做到在一个数组中实现数的修改等。

像字符串那个是从后往前存,也可以达成一样的效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值