模运算|z函数 字符串匹配

lc3345

直接 +n) % n 会越界,要

++% n + n) % n]; // 保证结果在 0,n-1 中++

class Solution {

public:

vector<int> constructTransformedArray(vector<int>& nums) {

int n = nums.size();

vector<int> result(n);

for (int i = 0; i < n; i++) {

resulti = nums((i + nums\[i) ++% n + n) % n]; // 保证结果在 0,n-1 中++

}

return result;

}

};

lc3031

++Z 算法 求出字符串的最长前缀匹配++

找到第一个能被 k 整除且匹配完整后缀的位置,返回最少操作次数

Z 算法就是快速找出字符串里,每个位置和开头的最长公共前缀长度

  • 给字符串 s ,算出数组 Z , ++Zi 表示 s 从 i 开始++,和 s 开头最长匹配多长。

  • 用一个++区间 l, r 记录当前最右的匹配区间, 避免重复比较++,做到线性时间 O(n)

  • 遍历每个位置:

  • 若在区间内,先继承已有结果;

  • 再暴力往后比,更新区间;

  • 最后得到完整 Z 数组。

sum:用区间复用结果,少做重复比较,快速拿到每个位置和开头的匹配长度

class Solution {

public:

int minimumTimeToInitialState(string s, int k) {

int n = s.size();

vector<int> z(n);

int l = 0, r = 0;

for (int i = 1; i < n; i++) {

if (i <= r)

zi = min(zi - l, r - i + 1);

while (i + zi < n && sz\[i] == si + z\[i]) {

l = i;

r = i + zi;

zi++;

}

if (i % k == 0 && zi >= n - i) {

return i / k;

}

}

return (n - 1) / k + 1;

}

};

相关推荐
春弦_5 小时前
自用算法整理二
数据结构·算法·图论
hetao17338376 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn6 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展
Navigator_Z7 小时前
LeetCode //C - 1301. Number of Paths with Max Score
c语言·算法·leetcode
卡卡~~8 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
企业数字化笔记8 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
学逆向的8 小时前
C 内存属性
c语言·开发语言·算法·网络安全
lengxuenong9 小时前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
ComputerInBook9 小时前
泛函分析概观
人工智能·算法·机器学习·泛函分析