模运算|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;

}

};

相关推荐
BothSavage2 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn2 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽4 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说20 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法