leetcode 3008. 找出数组中的美丽下标 II

题目如下

数据范围

复制代码
首先使用kmp算法统计两个串的出现下标,随后使用双指针匹配就行。这道题纯纯kmp模板题。

通过代码

cpp 复制代码
class Solution {
public:
    vector<int> beautifulIndices(string s, string a, string b, int k) {
        int al = a.size();
        int bl = b.size();
        int n = s.size();
        vector<int> af;
        vector<int> bf;
        vector<int> ans;
        vector<int> an(al, 0), bn(bl, 0);
        for (int i = 1, j = 0; i < al; i++) {
            while (j > 0 && a[i] != a[j])
                j = an[j - 1];
            if (a[i] == a[j])
                j++;
            an[i] = j;
        }
        for (int i = 1, j = 0; i < bl; i++) {
            while (j > 0 && b[i] != b[j])
                j = bn[j - 1];
            if (b[i] == b[j])
                j++;
            bn[i] = j;
        }
        int j = 0;
        int i = 0;
        while (i < n) {
            if (s[i] == a[j]) {
                i++;
                j++;
            } else {
                if (j > 0) {
                    j = an[j - 1];
                } else {
                    i++;
                }
            }
            if (al == j) {
                //   cout << i<< endl;
                af.push_back(i - al);
                j = an[j - 1];
            }
        }
        i = j = 0;
        while (i < n) {
            if (s[i] == b[j]) {
                i++;
                j++;
            } else {
                if (j > 0) {
                    j = bn[j - 1];
                } else {
                    i++;
                }
            }
            if (bl == j) {
                bf.push_back(i - bl);
                j = bn[j - 1];
            }
        }
        int l = 0, r = 0;
        while (l < af.size() && r < bf.size()) {
            if (abs(af[l] - bf[r]) <= k) {
                ans.push_back(af[l]);
                l++;
            } else if (af[l] < bf[r]) {
                l++;
            } else {
                r++;
            }
        }
        return ans;
    }
};
相关推荐
Lumos18623 分钟前
51单片机从零到实战(完结)——后续学习路线建议
算法
稚南城才子,乌衣巷风流28 分钟前
DFS序详解:原理、应用与实现
算法·深度优先·图论
稚南城才子,乌衣巷风流33 分钟前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
小保CPP37 分钟前
OpenCV C++将多张图像合并为webp动图
c++·人工智能·opencv·计算机视觉
zander2581 小时前
114. 二叉树展开为链表
数据结构·链表·深度优先
乐观勇敢坚强的老彭1 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
码上有光1 小时前
异常和智能指针
java·大数据·c++·servlet·异常·智能指针
变量未定义~1 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗2 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
王维同学2 小时前
[原创][Windows C++]Explorer Shell 扩展、图标覆盖与 COM 服务器定位
c++·windows·注册表