7-3 字符串模式匹配 (5 分)

7-3 字符串模式匹配 (5 分)
给定主串s和模式串p,编写程序输出p在s中出现的首位置,若p不在s中则输出-1。字符串下标从0开始。

输入格式:
输入为2行,第1行主串s,第2行为模式串p。主串和模式串长度不超过100000。

输出格式:
输出为2行,第1行为若干整数,表示模式串p的失败函数值****//这是啥意思,每个整数后一个空格;第2行为一个整数,表示p在s中出现的首位置,若p不在s中则输出-1。

输入样例:
qwerabcabhlk
abcab
输出样例:
-1 -1 -1 0 1
4

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100001//这个数字必须大
int la,lb;
int next[N];
char a[N],b[N];
//next[i]=j,表示前缀j-1和后缀j-1位一定一样,开始匹配第j位
//所以next[i]=j。然后看后面第i位是不是前缀的第j位,
//是的话就开始比较i+1,否则执行else,j=next[j],就是前面最大的是j,所以第i+1的最大的相同前后缀是next[j]
//++i
//:先增加,后引用,先执行i=i+1;再用运算后的i进行其它计算。
void Next()
{
    int i=2,j=0;
    for(i=2; i<=lb; i++)
    {
        while(j>0&&b[i]!=b[j+1])
        {
            j=next[j];
        }
        if(b[i]==b[j+1])j++;
        next[i]=j;
    }
}
int KMP(char a[],char b[])
{
    int j=0,t=0;
    for(int i=1; i<=la; i++)
    {
        while(j>0&&b[j+1]!=a[i])
        {
            j=next[j];
        }
        if(b[j+1]==a[i])j++;
        if(j==lb)
        {
            t=i-lb+1;//遍历了模式串
        }
    }
    return t;
}
int main()
{
    scanf("%s",a+1);// 字符串从[ s地址 + 1 ]开始
    la=strlen(a+1);
     scanf("%s",b+1);
   lb=strlen(b+1);
        Next();
        int m=KMP(a,b);
        for(int i=1;i<=lb;i++){
    printf("%d ",next[i]-1);
       }
           printf("\n%d",m-1);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这道题是关于b'7-1'字符串模式匹配,需要使用字符串匹配算法来实现。常见的字符串匹配算法有暴力匹配、KMP算法、Boyer-Moore算法等。其中,KMP算法在时间复杂度和实现难度上都有很大优势,所以这里推荐使用KMP算法。 KMP算法的基本思想是使用一个next数组来记录模式中前后缀的匹配情况,从而加快匹配的速度。具体实现流程如下: 1.计算出模式的next数组(即前缀表),从而记录下每个位置之前的最长前缀和最长后缀的匹配长度。 2.将模式和文本对齐,从第一个字符开始匹配。 3.如果匹配成功,则继续比较下一个字符;如果匹配失败,则根据next数组移动模式位置。 4.重复2、3步骤,直到匹配完成或者文本已经被扫描完。 在实际实现中,需要注意一些边界情况和特殊情况的处理,例如需要初始赋值next[0]=-1,以及在匹配成功后更新next数组等。 总之,KMP算法可以快速高效地实现字符串匹配,并且适用范围广泛,是值得掌握的一种算法。 ### 回答2: 7-1 模式匹配是一种计算机算法,用于寻找目标字符串中是否包含模式字符串。该算法可以被广泛应用于文本搜索、数据压缩、图形识别等领域。 该算法核心思想是从目标字符串的第一个字符开始,逐个字符地与模式字符串进行匹配。当匹配到不相同的字符时,算法会将目标字符串向右移动一位,重新开始匹配。如果匹配成功,则返回目标字符串中的匹配位置。 模式匹配可以使用多种算法实现,例如朴素的暴力匹配、KMP算法、Boyer-Moore算法等。这些算法的时间复杂度不同,实际应用时需要根据情况选择最优算法,以提高匹配效率。 在实际应用中,模式匹配可以帮助程序员快速地定位并处理文本中的关键信息,例如搜索引擎中的搜索关键字、邮件客户端中的过滤器等。同时,该算法也可以用于字符串的压缩和加密,如基于哈夫曼编码的数据压缩算法中的字符串匹配部。 总之,模式匹配是一种十重要的算法,它在实际应用中有着广泛的应用和重要的作用。 ### 回答3: 7-1 模式匹配是指,在一个长度为 n 的字符串中,找到一个长度为 m 的模式第一次出现的位置。这是一道经典的字符串匹配问题,具有很高的实用和理论意义。本题考察的是的基本算法和数据结构。 一般来说,模式匹配可以使用暴力法、KMP算法、Boyer-Moore算法和Rabin-Karp算法等多种方法。其中,暴力法是最基本的方法,但效率较低;KMP算法在实际应用中比较常用,可以在O(n+m)的时间复杂度内完成匹配;而Boyer-Moore算法和Rabin-Karp算法则更注重算法的实现效率。 暴力法的基本思路是,对主中的每个字符,从该字符开始与模式中的字符依次比较,若不相同,则主向后移动一位,继续比较下一个字符。这种方法的时间复杂度为O(nm),在实际应用中效率较低,但对于小规模的问题还是比较有效的。 KMP算法的核心思路是使用一个next数组来预处理模式中的信息,即找出模式中的最长公共前缀和后缀。在匹配时,若出现了不匹配的情况,则可以利用next数组中的信息跳过一部不必要的比较,从而减少比较的次数。KMP算法的时间复杂度为O(n+m),具有较高的实际应用价值。 Boyer-Moore算法则利用了两种策略:坏字符规则和好后缀规则。其中,坏字符规则主要是针对模式中的失配字符,而好后缀规则则是针对模式中的某个后缀在前面已经出现过的情况。这种算法的时间复杂度为O(n),但需要进行多次预处理,实现较为复杂。 Rabin-Karp算法利用哈希函数完成匹配,同时还可以通过哈希函数的值快速判断两个字符串是否相等。其中,主和模式都需要经过哈希处理。该算法的时间复杂度一般为O(n+m),但在最坏情况下可达到O(nm)。 综上所述,不同的算法适合不同的场景,具体选择要根据实际情况做出权衡。在实际应用中,KMP算法和Boyer-Moore算法比较常用,而Rabin-Karp算法则相对较少使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值