【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

Unity物理引擎实战:从刚体重心到碰撞体,打造真实不倒翁交互

刚体(Rigidbody)是Unity物理系统的核心组件,它定义了游戏对象的物理属性,如质量、阻力和碰撞响应。其原理基于牛顿力学,通过物理引擎(如PhysX)实时计算物体的运动状态。在游戏开发中,刚体的价值在于能够模拟真实世界的物理行为,为玩家提供沉浸式的交互体验。碰撞体(Collider)则定义了物体的形状边界,用于检测与其他物体的接触。通过精细调整刚体的重心(Center of Mass)和碰撞体形状,开发者可以模拟出各种有趣的物理现象,例如低重心物体的动态平衡。这在休闲游戏、物理玩具模拟等场景中尤为实

weixin_33976326的博客 355

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

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

sjb2274540432的博客 2963

IBM 3560M3 R5 坏盘更换记录

公司一台老旧 3650M3在日常巡查过程中发现硬盘报错

ddriv的博客 3945

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

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

shineinwind的博客 822

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4291

模电仿真软件:MultSim14.3下载与安装

在setup文件夹中,找到【Install.exe】文件,然后右键单击选择【以管理员身份运行】(这一步超级重要,否则可能会出现权限不足导致安装失败)!解压完成后,打开解压出来的文件夹,找到并进入【setup】文件夹(这一步很重要,不要进错文件夹)。4、在弹出的安装向导中,仔细阅读许可协议后,选择【我接受】,然后点击【下一步】继续安装过程。首先我们需要将下载好的安装包解压到本地文件夹,确保有足够的磁盘空间(建议至少5GB以上)!按照安装向导的提示,点击【下一步】继续(保持默认设置即可,除非你有特殊需求)

weixin_44264994的博客 2337

关于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

四足机器人机械结构设计:从腿型到驱动的全面解析

本文全面解析了四足机器人机械结构设计的核心要点。资深工程师老张深入探讨了并联腿与串联腿的选型策略、不同腿型布局对稳定性的影响,并详细对比了皮带轮与连杆驱动方式的优劣。文章结合实战经验,强调了足端设计、材料选择及整体结构轻量化等关键细节,为机器人开发者提供了从理论到实践的宝贵指导。

assembly8low的博客 633

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

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

等风来 684

SAP ERP 系统订单行项目中的计划行(Scheduled Line)详解

*计划行(Scheduled Line)**是SAP系统中订单行项目(如采购订单、生产订单、销售订单等)的细分单元,用于记录和管理物料的供应或需求计划。每个订单行项目可以包含一个或多个计划行,每个计划行对应具体的交货日期、数量、需求类型(如采购申请、生产订单、库存调拨等)以及相关的物流控制参数。简单来说,计划行是系统对某一物料在特定时间点的供需状态的详细规划,它将订单分解为更细粒度的执行步骤,确保供应链各环节(如采购、生产、仓储)能够按计划协同工作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3391

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

weixin_42412049的博客 2300

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

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

m0_62294708的博客 1413

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

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

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

m0_63485942的博客 4014

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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、付费专栏及课程。

余额充值