当前位置: 首页 > news >正文

【PTA数据结构 | C语言版】字符串匹配算法

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

请编写程序,得到模式串 t 在主串 s 中首次出现的位置。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 10^5,Pattern 长度为 10;
  • 数据2:随机数据,String 长度为 10^5,Pattern 长度为 10^2;
  • 数据3:随机数据,String 长度为 10^5,Pattern 长度为 10^3;
  • 数据4:随机数据,String 长度为 10^5,Pattern 长度为 10^4;
  • 数据5:String 长度为 10^6,Pattern 长度为 10^5;测试尾字符不匹配的情形;
  • 数据6:String 长度为 10^6,Pattern 长度为 10^5;测试首字符不匹配的情形。

输入格式:
输入先后给出主串 s 和模式串 t,每个非空字符串占一行,以回车结束(回车不算在字符串内)。

输出格式:
如果匹配成功,则输出 s 从 t 首次出现的位置开始的子串;否则输出 匹配失败。。

输入样例 1:
This is a simple test.
is

输出样例 1:
is is a simple test.

输入样例 2:
This is a test.
simple

输出样例 2:
匹配失败。

代码

#include <stdio.h>
const int cnt = 1000000;// KMP算法的预处理函数:计算部分匹配表(next数组)
void build(char* p, int m, int next[]) {next[0] = -1;  // 初始化next数组int k = -1;    // 前缀长度// 构建next数组,长度为m-1for(int j = 0; j < m - 1; j++) {// 若字符不匹配,回溯到上一个可能的位置while(k >= 0 && p[j] != p[k])k = next[k];k++;next[j + 1] = k;  // 记录当前位置的最长公共前后缀长度}   
}// KMP字符串匹配主函数
int kmp(int n, int m, char* s, char *p) {int i = 0;  // 主串指针int j = 0;  // 模式串指针int next[cnt];// 预处理模式串,构建next数组build(p, m, next);// 双指针遍历主串和模式串while(i < n && j < m) {// 当前字符匹配或需要从头开始匹配if(j == -1 || s[i] == p[j]) {i++;j++;} else {// 字符不匹配,利用next数组回退模式串指针j = next[j];}}// 匹配成功返回起始位置,否则返回-1return (j == m) ? i - m : -1;
}int main() {char p[cnt]; // 模式串char s[cnt]; // 主串int n = 0;   // 主串长度int m = 0;   // 模式串长度// 读取主串(不包含换行符)while ((s[n] = getchar()) != '\n') {n++;}// 读取模式串(不包含换行符)while ((p[m] = getchar()) != '\n') {m++;}// 执行KMP匹配int q = kmp(n, m, s, p);// 输出匹配结果if (q != -1) {// 输出从匹配位置开始的子串for (int i = q; i < n; i++) {printf("%c", s[i]);}printf("\n");} else {printf("匹配失败。\n");}return 0;
}
http://www.dtcms.com/a/279567.html

相关文章:

  • es的自定义词典和停用词
  • 天海电子闯上市:业绩增速骤降,“踩雷”合众汽车,存坏账风险
  • Go从入门到精通(22) - 一个简单web项目-统一日志输出
  • 5.浏览本地文件获取路径与文件名称 C#例子 WPF例子
  • Elasticsearch 9.x 升级变化
  • 【安卓笔记】线程基本使用:锁、锁案例
  • Windows安装postgreSQL(保姆级教程)
  • 机床自动化中的“方言翻译官”:EtherNet/IP 转 PROFIBUS DP 实战手记
  • 安全初级(一)
  • 胡志明证券交易所新一代交易系统解决方案——基于美联储利率决议背景下的越南跨境金融基础设施升
  • pycharm恢复出厂设置,可以解决大多数pycharm存在的问题
  • nginx:SSL_CTX_use_PrivateKey failed
  • 怎么 将训练后的词嵌入向量反编译为自然语言
  • AI多因子模型解析白银14年新高:流动性压力与工业避险需求的联动效应
  • 数字化工厂规划-项目启动会汇报材料编写思路
  • Android Studio C++/JNI/Kotlin 示例 二
  • 三相新能源并网系统序阻抗模型——序阻抗分析器IMAnalyzer
  • Docker部署语音转文字(STT)服务并接入Home Assistant
  • linux服务器redis配置开机自启
  • 2025 R3CTF
  • 我的开源项目-AI Agent 配置系统
  • 技嘉UEFI固件SMM漏洞使系统面临固件植入和持久控制风险
  • Oracle 学习笔记
  • 【工具变量】A股上市公司产学研合作及专利数据统计(1998-2023年)
  • TextIn:文档全能助手,让学习效率飙升的良心软件~
  • 《汇编语言:基于X86处理器》第7章 复习题和练习,编程练习
  • RAG索引流程中的文档解析:工业级实践方案与最佳实践
  • SMTPman,发送邮件服务器smtp怎么填才行?
  • 鹧鸪云:别墅光储项目方案设计的最终选择
  • 面试150 二叉树中的最大路径和