【续前】串的基本操作之串的模式匹配

6 篇文章 0 订阅
5 篇文章 0 订阅
本文介绍了串的基本操作之一——模式匹配,包括低效的一般算法和高效的KMS算法。KMS算法是串模式匹配的一种有效方法,适用于考试复习和学习笔记。
摘要由CSDN通过智能技术生成

昨天的是关于串的三种存储方式及基于堆分配存储的一些基本操作,由于串的操作很重要,串的模式匹配也是很重要的操作之一,下面简单介绍下其算法:

一、一般算法(低效)

下面是基于串的堆分配存储实现的,效率比较低的串模式匹配算法。

//基于串的对分配存储表示的模式匹配算法
int Index(HString &S, HString &T, int pos)
{
    //返回串T在主串S中第pos个字符后的位置,若不存在,返回0
    //其中,T非空,且1<=pos<=S.length
    int i, j;
    i = pos;
    j = 0;
    while(i <= S.length && j < T.length)
    {
        if(S->ch[i-1] == T->ch[j]) { ++i, ++j;}  //比较后续字符
        else  {i = i-j+1; j = 0;}                //指针回退重新比较
    }
    if( j = T->length)  return  i - T.length;
    else  return 0;
}//Index

二、KMS算法(高效)

//基于串的定长顺序存储表示的KMS算法及其辅助数组next的求解

void get_next(SString T, int next[])
{
    //求模式串的next函数值,存入数组next
    int i, j;
    while(i < T[0])
    {
        if(j == 0 || T[i] == T[j])  { ++i;  ++j;  next[i] = j;}  
        else  j = next[j];
    }
}//get_next

int Index_KMS(SString S, SString T, int pos)
{
    int i, j;
    while(i <= S[0] && j <= T[0])
    {
        if(j == 0 || S[i] == T[j] )  { ++i; ++j;}
        else  return 0;
    }
    if(j > T[0] )  return  i - T[0];
    else  return  0;
}//Index_KMS
这个算法和前面的算法很类似,高效之处在于它不用回溯,一趟比较完毕;这个算法需要一个辅助数组,指示失配之后要从什么地方开始继续匹配。

算法还算容易理解,面临考试,这是笔记吧,随便记录下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值