【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

西瓜书第二章——模型评估与选择(十折交叉验证/查准查全F1)

第二章——模型评估与选择

xsddys的博客 953

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

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

sjb2274540432的博客 2963

2022年TI杯模拟电⼦系统设计专题邀请赛——李萨如图形演示装置

本次装置主要是对输入的正弦信号进行频率变换,并将原输入正弦信号作为 X 轴信号、变换后的正弦信号作为 Y 轴信号,绘制李萨如图形。采用 EK-TM4C123GXL 板卡作为主控;频率变换采用“锁向环+计数器”实现 1-5 倍频的频率变换控制;李萨如图形采用两个 AD通道采集原输入的正弦信号作为 X 轴信号和频率变换后的正弦信号作为 Y 轴信号,绘制李萨如图形。

qq_45890466的博客 7769

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

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

shineinwind的博客 822

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 336

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2646

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

【SAP HANA 46】关于HANA CPU高峰到 80-100%

关于HANA CPU高峰到 80-100%

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 429

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

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

等风来 684

代码复现1——Matterport3d数据集下载

进入“Dataset Download”部分,下载申请书,填写之后发送到指定邮箱(matterport3d@googlegroups.com),之后会收到回信,回信中附有一个download_mp.py的脚本文件。,大小约15G,并不是所有的Mp3d datasets,所有大小约1.3T。下载完成后如下图所示:我这边显示大小为16.1G。

qq_44100524的博客 8056

winform自定义控件(gdi+)(1)———设置透明背景色

本文详细讲解了如何在winform中设置控件的背景色为透明色

qq_34059233的博客 3688

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

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

m0_62294708的博客 1413

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

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

m0_63485942的博客 4014

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

余额充值