问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

串的模式匹配

发布网友 发布时间:2022-04-25 03:17

我来回答

2个回答

热心网友 时间:2023-10-22 21:26

# include <string.h>
# include <stdio.h>
# include <stdlib.h>
# define OK 1
# define ERROR 0
typedef int Status;
//串的定长顺序存储结构
# define MAX_STR_LEN 40
typedef char SString[MAX_STR_LEN + 1];//0号单元存放串的长度
Status StrAssign(SString T,char * chars)//生成一个其值等于chars的串T
{
int i;
if (strlen(chars) > MAX_STR_LEN)
{
return ERROR;
}
else
{
T[0] = strlen(chars);
for (i=1; i<=T[0]; ++i)
{
T[i] = * (chars + i - 1);
}
return OK;
}
}
//返回串S的元素的个数
int StrLength(SString S)
{
return S[0];
}
//用Sub返回串S的自第pos个字符起长度为len的子串
Status SubString(SString Sub,SString S,int pos,int len)
{
int i;
if (pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1)
{
return ERROR;
}
for (i=1; i<=len; ++i)
{
Sub[i] = S[pos+i-1];
}
Sub[0] = len;
return OK;
}
//输出字符串T
void StrPrint(SString T)
{
int i;
for (i=1; i<=T[0]; ++i)
{
printf("%c ",T[i]);
}
printf("\n");
}
//求模式串T的next函数值并存入数组next
void get_next(SString T,int next[])
{
int i = 1,j = 0;
next[1] = 0;
while (i < T[0])
{
if (j==0 || T[i]==T[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}
//求模式串T的next函数修正值并存入数组nextval
void get_nextval(SString T,int nextval[])
{
int i = 1,j = 0;
nextval[1] = 0;
while (i < T[0])
{
if (j==0 || T[i]==T[j])
{
++i;
++j;
if (T[i] != T[j])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j];
}
}
else
{
j = nextval[j];
}
}
}
//利用模式串T的next函数求T在主串S中第pos字符之后的位置的KMP算法
//1=<pos=<StrLength(S)
int Index_KMP(SString S,SString T,int pos,int next[])
{
int i = pos,j = 1;
while (i<=S[0] && j<=T[0])
{
if (j==0 || S[i]==T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
int main(void)
{
int i,* p;
SString s1,s2;
StrAssign(s1,"aaabaaaab");
printf("主串为:");
StrPrint(s1);
StrAssign(s2,"aaaab");
printf("子串为:");
StrPrint(s2);
p = (int *)malloc((StrLength(s2) + 1) * sizeof(int));
get_next(s2,p);
printf("子串的next的数组为:");
for (i=1; i<=StrLength(s2); ++i)
{
printf("%d ",* (p+i));
}
printf("\n");
i = Index_KMP(s1,s2,1,p);
if (i)
{
printf("主串和子串在第%d个字符处首次匹配\n",i);
}
else
{
printf("主串和子串匹配不成功\n");
}
get_nextval(s2,p);
printf("子串的nextval数组为:");
for (i=1; i<=StrLength(s2); ++i)
{
printf("%d ",* (p+i));
}
printf("\n");
printf("主串和子串在第%d个字符处首次匹配\n",Index_KMP(s1,s2,1,p));
printf("求串s1的从第5个字符起长度为5的子串s2:\n");
SubString(s2,s1,5,5);
printf("串s2为:");
StrPrint(s2);
return 0;
}
/*
在vc++6.0中的输出结果:
------------------------
主串为:a a a b a a a a b
子串为:a a a a b
子串的next的数组为:0 1 2 3 4
主串和子串在第5个字符处首次匹配
子串的nextval数组为:0 0 0 0 4
主串和子串在第5个字符处首次匹配
求串s1的从第5个字符起长度为5的子串s2:
串s2为:a a a a b
Press any key to continue
------------------------------
*/
请采纳答案,支持我一下。

热心网友 时间:2023-10-22 21:26

如果是学习c语言的话 我觉得这片文章很好http://wenku.baidu.com/link?url=_p8PZNa_rFfYbgclrerqqoKYFG47YY0eNMg9TJ1AS-y2MdWjG_8DCb6RGrCle_bzrp0xrAkIyU5IFG2xh2mdU6_IkbpnpnR_bebZtXpUUIO
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 什么是字符串多模式匹配和字符串多模式匹配?算法又如何? 模式匹配的概念 Java编程实现字符串的模式匹配 字符串的模式匹配算法 魔兽世界3.13版本的用荣誉换S2武器NPC在哪? 去北京八达岭长城从西直门坐S2的话,在哪 燃烧的远征s2在哪换 魔兽世界S2武器在那里换多 ? 魔兽世界s2在加基森哪换 S1,S2,S3分别在哪买? 魔兽世界竞技场装备S2在哪换 魔兽世界S2在哪换 wows2在哪换 现在魔兽的S2在哪买 WOW中的S2在哪可以看到? 乐清轻轨s2虹桥站设在哪里 电动汽车s2开关在哪 魔兽世界法师的S2在哪换? 即将开通的S2线在昌平设站,具体昌平什么位置呀? WOW S2在哪换``详细地点~~一套要多少荣誉 数据结构 字符串 模式匹配问题 KMP算法 字符串匹配(常规方法) 字符串的模式匹配实现的什么功能? 为什么字符串模式匹配不行?运行可以,结果是一直输出是-1. C语言(数据结构)字符串的模式匹配程序求改错!~~!!~ 在Word编辑中,模式匹配查找中能使用的通配符是? 字符串匹配的介绍 字符串的匹配功能是什么意思 数据结构(c++)字符串 模式匹配算法问题,对高手来说只要写一点点_百度... 如何使用IPTables实现字符串模式匹配 几种单字符串模式匹配算法的简介,C/C++实现及性能对比 怎么敲python 模式匹配问题。设模式字符串只含有英文字母、数字字符、问号“? patsubst:模式字符串替换 我想问下什么是模式字符串啊??这是一道linux的知识。 脚本里面如何比较字符串的匹配模式 21、下列哪些字符串匹配模式”。boy&#92;&#92;w[3]”( )。 A、boy111 B、boy!@# C、boyweo D、boyboyboyboy 2021年天狼最新电视剧排行是什么? 20216月14王者荣耀苹果系统天狼系列皮肤为什么没有返场? 2021年的火星? 2021年四美皮肤上线顺序是什么? 2021天狼影视好看的古装剧有哪些?