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

数据结构PTA title: 曲师大计院20级的PTA categories: - 数据结构 tags: - PTA toc: true 第一章 绪论 判断题 1-1 数据元素是数据的最小单位。F(数据项) 1-2 数据的逻辑结构是指数据的各数据项之间的逻辑关系。F(数据元素之间) 1-3 数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。T 1-4 数据结构的抽象操作的定义与具体实现有关。F 1-5 算法和程序没有区别,在数据结构中二者是通用的。F 1. 阅读详情

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

文章目录

题目

请编写程序,得到模式串 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-1
    for(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];
        }
    }
    
    // 匹配成功返回起始位置,否则返回-1
    return (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;
}
KMP算法单次匹配详解:next数组构造与PTA实战 字符串匹配是计算机科学中的基础问题,从文本编辑器到基因序列比对,都离不开高效的模式匹配方法。朴素匹配算法虽然直观,但面对主串与模式串高度重复的最坏情况,其O(n×m)的时间复杂度往往难以满足实际需求。KMP算法通过构造next数组,利用最长公共前后缀的信息,实现主串指针不回退、模式串指针精准跳转,将匹配复杂度降至O(n+m),是数据结构与算法学习中的关键内容。该算法被广泛应用于搜索引擎、生物信息学、文本处理等场景。在PTA等在线判题平台的题目中,KMP单次匹配要求模式串在主串中首次出现后立即返回,掌握其ne 阅读详情

相关推荐

别只刷LeetCode了!用PTA的‘德才论’和‘福尔摩斯约会’真题,聊聊C语言如何玩转字符串和结构体排序

本文通过PTA平台上的'德才论'和'福尔摩斯约会'两道经典题目,深入解析C语言中字符串处理与结构体排序的实战技巧。文章详细讲解了多关键字排序和复杂字符串匹配的实现方法,并分享了防御性编程和代码优化的实用建议,帮助开发者提升C语言工程化能力。

weixin_30788239的博客 552

字符串模式匹配(KMP模板题)

给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。 输入格式: 输入共两行,分别是字符串text 和模式串pattern。 输出格式: 输出一个整数,表示 pattern 在 text 中的出现次数。 输入样例1: zyzyzyz z...

zp1455604302的博客 2382

PTA_C语言编程实验:有序数组插入与符号匹配

在当今的IT行业中,PTA(Programming Teaching Assistant)平台被广泛应用于编程教育和技能提升。PTA平台作为一种辅助教学和自我练习的工具,它通过在线编程题库和自动评测系统,为程序员和学生提供了实时反馈和实践机会,有助于提升解题和编程能力。PTA平台的核心优势在于能够提供大量的编程练习题,并即时给出结果反馈。这种及时性不仅缩短了学习周期,还提高了学习效率。此外,PTA通常还支持多语言编程,如C/C++、Java、Python等,满足不同开发者的需求。

weixin_31163455的博客 1068

【PTA】 字符串的模式匹配

本题目要求读入两个两个DNA序列A和B,其中A为人的DNA序列,B为病毒的DNA序列,然后判断A中是否出现病毒B(注:病毒的DNA序列为环状)。 输入格式 输入一个整数n,然后输入n对DNA序列(每一DNA序列为一字符串,长度不超过10000)。 输出格式针对每一对DNA序列A和B,若B在A中出现,则输出Yes,否则输出No

m0_74195626的博客 4365

PTA数据结构与算法刷题实战:从本地调试到OJ提交全攻略

数据结构与算法是编程能力的基石,而在线判题系统(OJ)则是检验掌握程度的试金石。在刷题过程中,许多学习者常陷入“本地能跑但提交报错”的困境,根源往往是对编译环境、边界条件与算法复杂度的把控不足。针对C语言学习者,掌握GCC指令、GDB调试及对输入数据规模的敏感度,是高效提升的关键。围绕PTA平台,从线性表到KMP算法,从堆排序到数组越界规避,工程实践中沉淀出的技巧与避坑经验,能显著提高刷题效率。深入了解并优化这些工程细节,不仅有助于应对课程考核,更能为参与蓝桥杯等算法竞赛打下坚实基础。本文以PTA题目集的实

weixin_28742653的博客 245

卫星载荷应用方案

本文将从技术和应用层面探讨卫星载荷的应用方案,分析各个领域的特点和挑战,以期为卫星载荷的应用提供一定的指导和参考。卫星载荷应用方案涵盖了通信、地球观测、气象预报、导航定位等诸多领域在每一个领域中,都存在着不同的技术挑战和应用需求。随着技术的进步和需求的变化,卫星载荷应用方案将不断发展和完善,为人类社会的进步和发展做出更大的贡献。用户可以通过接收多颗卫星的信号,计算自身的位置和速度信息。在覆盖扩展方面,可以采用多星座、MEO、GEO 等不同轨道高度的卫星布局,结合卫星的特点和应用需求,实现覆盖范围的扩展。

muyangjun的专栏 904

KMP算法讲解 +例题:PTA 7-6 字符串模式匹配(KMP)

提前说一下,我个人也是菜鸟,刚学会KMP ,以下是一些我整合的自己的思考和GPT老师教我的方法。KMP算法(Knuth-Morris-Pratt算法)是一种用于在一个字符串(文本)中查找一个子串(模式串)的高效算法。KMP算法的核心思想是利用模式串本身的特性,在匹配过程中尽可能减少不必要的比较次数。KMP算法的关键是构建一个最长公共前后缀数组(LPS数组),这个数组告诉我们在模式串中对于每个位置,最长的相等的前缀和后缀有多长。有了这个数组,我们可以利用已经匹配过的信息来避免不必要的回溯。

sjb2274540432的博客 2963

STM32H743 LAN8720网口配置避坑指南:用CubeMX v6.5.0快速搞定LWIP+FreeRTOS

本文详细介绍了使用CubeMX v6.5.0配置STM32H743与LAN8720网口的LWIP+FreeRTOS方案,涵盖硬件连接、时钟配置、ETH外设初始化及LWIP协议栈调优等关键步骤。特别针对常见陷阱提供解决方案,帮助开发者快速实现稳定网络通信,适用于嵌入式网络开发场景。

weixin_33739523的博客 357

PTA 7-1 字符串匹配问题(strs)

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出OK,不匹配就输出Wrong。

shineinwind的博客 822

OpenClaw部署太难?汉化版+中文社区+国产替代品,国内用户零门槛指南

OpenClaw作为GitHub 10万+星的开源AI助手平台,近期在国内AI圈备受关注 🌟 但部署难度和英文界面让很多用户望而却步。本文整理了针对国内用户的友好资源和简便替代方案,帮助国内用户零门槛上手AI助手工具 🚀

XiaoqiangClub的博客 5758

Autosar PWM模块的配置和使用

在上面的代码中,我们首先配置了PWM的初始化参数,包括频率和分辨率。GPIO Driver:由于PWM信号需要输出到特定的引脚上,因此我们还需要使用GPIO驱动程序来控制引脚的状态。通过合理配置和应用PWM模块,我们可以实现对汽车电子系统中各种功能的精确控制,从而提高汽车性能和用户体验。在实际应用中,我们可以根据需要进行更多的配置和调整,以实现灵活的PWM控制。PWM Driver:这是主要的PWM驱动程序,负责产生PWM信号并输出到相应的引脚上。接下来,我们需要配置PWM模块的参数。

TcData的博客 682

关于KMP的next数组

明明写的和课本一样,但是在PTA就是不正确,参考了别人的答案,发现有一个地方不一样记录一下! #include<stdio.h> #include<stdlib.h> #include<string.h> int next1[1000]; //next1[j] = k,表示当T[i] != P[j]时,j指针的下一个位置。 //求字串在主串中第一次出现的位置 void get_next1(char T[1000],int next1[],int len) { in

Asssshzy的博客 200

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1619

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

给定两个由英文字母组成的字符串 string 和 pattern,要求找到 pattern 在 string 中第一次出现的位置,并将此位置后的 string 的子串输出。如果找不到,则输出“Not Found”。本题旨在测试各种不同的匹配算法在各种数据情况下的表现。

等风来 684

GEE:耦合5个因子的kRSEI遥感生态指数(K Remote Sensing Ecological Index, KRSEI)计算

本文将介绍在 Google Earth Engine (GEE)平台上,如何耦合5个因子,进行 kRSEI 的计算。具体来说,分别计算了 `NDVI, WET, NDBSI,LST,NDRI` 5个因子,并使用 PCA 主成分分析方法计算了权重,最后,计算了 kRSEI 指数。

养乐多的博客 1417

unity从3D升级到urp管线,打包ab包后,材质全部变紫色

确保材质中的被转换为 URP 兼容的着色器。在打包 AssetBundle 时,确保所需的着色器被正确打包。确保运行 AB 包的目标项目中正确配置了 URP 渲染管线。如果加载后材质丢失,检查 AB 包的加载逻辑,确保材质正确应用了着色器。通过这些步骤,你应该能够解决从标准渲染管线切换到 URP 渲染管线后,材质在 AB 包中变紫色的问题。如果问题仍然存在,请根据具体错误日志进一步排查。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1963

PTA-数据结构字符串与数组|C语言版

PTA实验字符串与数组C语言版

m0_62294708的博客 1413

Qt 调用YOLO模型(代码)

本文介绍了如何在 Qt C++ 环境中集成 YOLO 模型进行目标检测,包括模型封装、界面设计和实时处理等关键步骤。通过这种方法,你可以快速开发出具有目标检测功能的 Qt 应用程序,应用于监控系统、机器人视觉、图像分析等多个领域。

轩宇的博客 259

C语言版数据结构与算法pta合集:7-3 括号匹配

本题目要求读入n个字符串,每个字符串是一个括号序列,如“{[()]}”,然后判断每个括号序列是否匹配。

我就知道你会来,我们一起进步吧! 2119

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

PTA数据结构与算法-第四章——字符串

文章目录第一章——褚论第二章——线性表第三章——栈与队列第四章——字符串判断题单选题 第一章——褚论 第二章——线性表 第三章——栈与队列 第四章——字符串 判断题 1-10 如果strcmp(s1,s2)返回的结果为0,表示字符串s1和s2不相同。 F 当s1<s2时,返回值<0; 当s1=s2时,返回值=0; 当s1>s2时,返回值>0; 1-4 假设模式串是abababaab,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2。 next

Eumenides_Suki的博客 6832

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PTA-21级数据结构与算法实验4——字符串和数组

21级数据结构与算法实验4——字符串和数组(参考答案)C语言实现

m0_63485942的博客 4014

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

pta算法题目讲解:括号匹配

经由栈结构赋能,这一代码方案举重若轻化解括号匹配难题,不仅精准核验匹配完整性,更将嵌套顺序难题悄然化解于无形。无需繁琐流程追踪嵌套细节,只需聚焦括号进出栈瞬间,匹配真谛已然紧握在手。此般优雅解法,正是算法与数据结构精妙融合的魅力彰显,为我们处理复杂字符串逻辑点亮一盏明灯,指引通往高效编程的通途。祝所有小伙伴学有所成!!有任何想法,欢迎评论区留言讨论哦~

Huazzi的博客 728

数据结构实验|PTA|栈操作|实验二 括号匹配判断算法

数据结构实验|PTA|栈操作|实验二 括号匹配判断算法题目算法分析基本思路:关于栈的基本建立源代码 题目 实验二 括号匹配判断算法 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4428 Accepted: 1693 Description 假设在表达式中([]())或[([ ][ ])]等为正确的格式,[( ])或([( ))或 (( )])均为不正确的格式。基于栈设计一个判断括号是否正确匹配的算法。 Input 输入数据有多组,

niwad的博客 2210

sdut-数据结构与算法pta-字符串和数组

给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。输入共两行,分别是字符串text 和模式串pattern。输出一个整数,表示 pattern 在 text 中的出现次数。33。

2302_81657110的博客 728

【PTA】【数据结构与算法】串与KMP算法

判断题 1.假设模式串是abababaab,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2。 T F 选择题 1.在用KMP算法进行模式匹配时,模式串“ababaaababaa”的next数组值为____。 选项 A -1,0,1,2,3,4,5,6,7,8,9,9 B -1,0,1,2,1,2,1,1,1,1,2,1 C -...

葑鈊丶 1万+

PTA乙级 PAT (Basic Level) Practice C语言(完结)

PTA乙级习题1001 害死人不偿命的(3n+1)猜想1002 写出这个数1003 我要通过!1004 成绩排名1005 继续(3n+1)猜想1006 换个格式输出整数1007 素数对猜想1008 数组元素循环右移问题1009 说反话 链接 PTA乙级 1001 害死人不偿命的(3n+1)猜想 #include<stdio.h> #include<stdlib.h> int main(){ int n; if(scanf("%d",&n)){} int

weixin_46720804的博客 6578
上一篇: 【PTA数据结构 | C语言版】字符串连接操作(不限长)
下一篇: 【PTA数据结构 | C语言版】字符串替换算法
秋说
秋说 优质创作者: 编程框架、信息安全技术领域 优质创作者: 编程框架、信息安全技术领域
博客等级 码龄4年 3万+粉丝 1906原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值