news 2026/6/19 11:48:47

Kimi LeetCode 3303. 第一个几乎相等子字符串的下标 C语言实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3303. 第一个几乎相等子字符串的下标 C语言实现

以下是 LeetCode 3303 的 C 语言实现,使用 Z-Function(Z 数组) 算法:

```c
#include <string.h>

// 计算 Z-Function 数组
// z[i] 表示 s[i..n) 与 s[0..n) 的最长公共前缀长度
static void zFunction(const char *s, int n, int *z) {
int l = 0, r = 0;
z[0] = 0;

for (int i = 1; i < n; i++) {
if (i < r) {
z[i] = (r - i < z[i - l]) ? r - i : z[i - l];
} else {
z[i] = 0;
}

while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
z[i]++;
}

if (i + z[i] > r) {
l = i;
r = i + z[i];
}
}
}

int minStartingIndex(char *s, char *pattern) {
int n = strlen(s);
int m = strlen(pattern);

// 正向匹配:pattern + s
int len1 = m + n;
char *str1 = (char *)malloc((len1 + 1) * sizeof(char));
strcpy(str1, pattern);
strcpy(str1 + m, s);

int *z1 = (int *)malloc(len1 * sizeof(int));
zFunction(str1, len1, z1);

// 反向匹配:reverse(pattern) + reverse(s)
int len2 = m + n;
char *str2 = (char *)malloc((len2 + 1) * sizeof(char));

// 反转 pattern
for (int i = 0; i < m; i++) {
str2[i] = pattern[m - 1 - i];
}
// 反转 s
for (int i = 0; i < n; i++) {
str2[m + i] = s[n - 1 - i];
}
str2[len2] = '\0';

int *z2 = (int *)malloc(len2 * sizeof(int));
zFunction(str2, len2, z2);

int result = -1;

// 枚举每个可能的起始位置 i
for (int i = 0; i <= n - m; i++) {
// z1[m + i]:从 s[i] 开始正向匹配 pattern 的最长前缀长度
// z2[n - i]:从 s[i] 末尾反向匹配 pattern 的最长后缀长度
// 两者之和 >= m - 1 说明中间最多只有 1 个字符不匹配
if (z1[m + i] + z2[n - i] >= m - 1) {
result = i;
break;
}
}

free(str1);
free(z1);
free(str2);
free(z2);

return result;
}
```

关键点

要点 说明
`malloc` + `free` C 中需手动管理内存,计算完 Z 数组后及时释放
字符串拼接 用 `strcpy` 将 `pattern` 和 `s` 拼接到新分配的缓冲区
反向构造 分别反转 `pattern` 和 `s` 后拼接,避免多次调用 `strrev`
`z1[m + i] + z2[n - i]` 正向前缀 + 反向后缀覆盖 `m-1` 个字符,即汉明距离 ≤ 1

复杂度

- 时间复杂度:O(n + m),两次 Z-Function 均为线性遍历
- 空间复杂度:O(n + m),两个拼接字符串和两个 Z 数组

与 Java 版本的区别

C 语言没有内置字符串反转和动态数组,需要手动:
1. `malloc` 分配拼接字符串的内存
2. 循环反转字符构造反向字符串
3. 手动 `free` 释放所有动态分配的内存

核心算法逻辑(Z-Function + 双数组匹配)与 Java/其他语言完全一致。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 11:41:28

11款米哈游游戏字体免费获取指南:为你的设计注入游戏灵魂

11款米哈游游戏字体免费获取指南&#xff1a;为你的设计注入游戏灵魂 【免费下载链接】HoYo-Glyphs Constructed scripts by HoYoverse 米哈游的架空文字 项目地址: https://gitcode.com/gh_mirrors/ho/HoYo-Glyphs 你是否曾经在设计同人作品时&#xff0c;苦于找不到合…

作者头像 李华
网站建设 2026/6/19 11:40:39

实验五 输入输出流

一、实验概述本次上机实验围绕 Java 输入输出字符流完成举重成绩自动统计工具&#xff0c;分为两个核心类&#xff1a;Fenxi.java负责文本数字提取求和&#xff0c;AnalysisResult.java完成文件读取、成绩计算、结果追加写入文件全流程。通过缓冲字符流实现文本文件高效读写&am…

作者头像 李华
网站建设 2026/6/19 11:38:24

GetQzonehistory:一键智能备份QQ空间完整回忆的终极方案

GetQzonehistory&#xff1a;一键智能备份QQ空间完整回忆的终极方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天&#xff0c;QQ空间承载着我们十余年的青春…

作者头像 李华
网站建设 2026/6/19 11:37:21

3分钟解锁虚拟显示魔法:ParsecVDD现代工作空间革命

3分钟解锁虚拟显示魔法&#xff1a;ParsecVDD现代工作空间革命 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 在数字工作空间日益复杂的今天&#xff0c;我们常常受限于物理显示…

作者头像 李华
网站建设 2026/6/19 11:36:22

三重护城河:基于433MHz方案的老人应急呼叫系统可靠性与抗干扰设计

明确了技术选型&#xff0c;下一步就是如何从工程层面构建牢不可破的可靠性。基于振浩微VM8806T发射芯片与RN532TS接收模块&#xff0c;我们可以为老人报警产品构筑三重防护。第一重&#xff1a;链路层抗干扰设计家用433MHz环境存在电磁干扰。为此&#xff0c;方案在链路层采用…

作者头像 李华