KMP刷leetcode速通

前言

KMP真厉害,刷题刷到 28.找出字符串中第一个匹配项的下标1668.最大重复子字符串

next 数组用来匹配不上时,前缀 j j j 可以快速回退到 n e x t [ j − 1 ] next[j-1] next[j1] 的位置。

void getNext(vector<int>& next, const string& s) {
   int j = 0;  // 后缀
   // next[0] = 0;  // next初始化为 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;   // 更新next数组
   }
}

题目

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


模版题, getNext可以重复使用

class Solution {
public:
    void getNext(vector<int>& next, const string& s) {
        int j = 0;  // 后缀
        // next[0] = 0;  // next初始化为 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;   // 更新next数组
        }
    }
    
    int strStr(string haystack, string needle) {
        // needle是子串
        if (haystack.size() == 0 || needle.size() == 0)
            return -1;
        
        vector<int> next(needle.size(), 0);
        // 构建 next 数组
        getNext(next, needle);

        int j = 0;
        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;
    }
};

1668 最大重复子字符串


KMP + 动态规划,很难想象这是 简单

class Solution {
public:
    void getNext(vector<int>& next, string s) {
        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 maxRepeating(string sequence, string word) {
        int n = sequence.size(), m = word.size();
        if (n < m)
            return 0;
        
        vector<int> next(m, 0);
        getNext(next, word);

        // 动态规划 dp[i]表示 sequence[0..i]最多有dp[i]个word
        vector<int> dp(n, 0); 
        int j = 0;
        for (int i = 0; i < sequence.size(); i++) {
            while(j > 0 && sequence[i] != word[j])
                j = next[j - 1];
            if (sequence[i] == word[j])
                j++;
                
            if (j == m) {  // 匹配上了开始 dp 操作
                if (i >= m)
                    dp[i] = dp[i - m] + 1;
                else
                    dp[i] = 1;
            }
        }

        int maxVal = 0;
        for (int val: dp)
            maxVal = max(maxVal, val);
        return maxVal;
    }
};

相关推荐

  1. ES6

    2024-04-10 03:48:02       43 阅读
  2. Docker概念

    2024-04-10 03:48:02       7 阅读
  3. Matlab知识点(半小时

    2024-04-10 03:48:02       7 阅读
  4. 常见SQL语句

    2024-04-10 03:48:02       32 阅读
  5. Vite 官方文档

    2024-04-10 03:48:02       47 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-10 03:48:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-10 03:48:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-10 03:48:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-10 03:48:02       20 阅读

热门阅读

  1. 选择排序-c++

    2024-04-10 03:48:02       17 阅读
  2. Linux从入门到精通 --- 1.初始Linux

    2024-04-10 03:48:02       13 阅读
  3. 线程常见问题

    2024-04-10 03:48:02       16 阅读
  4. c++day6

    c++day6

    2024-04-10 03:48:02      16 阅读
  5. 【接口测试】接口测试面试基础常识

    2024-04-10 03:48:02       15 阅读
  6. 京东采集器使用教程 京东商家爬虫软件分享

    2024-04-10 03:48:02       14 阅读
  7. 数字排列的方法

    2024-04-10 03:48:02       12 阅读
  8. 题目:取一个整数a从右端开始的4~7位。

    2024-04-10 03:48:02       14 阅读
  9. 前端将列表数据转换为树形数据的函数

    2024-04-10 03:48:02       11 阅读
  10. CSS世界Ⅱ(文本)

    2024-04-10 03:48:02       15 阅读
  11. js sort() 方法

    2024-04-10 03:48:02       12 阅读