KMP简单应用

本文详细介绍了一种高效的字符串匹配算法——KMP算法,并通过示例解释了如何使用该算法来判断一个字符串是否为另一个字符串的子串。此外,还提供了一个完整的C语言实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定两个字符串string1和string2,判断string2是否为string1的子串。

输入

 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

输出

 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

示例输入

abc
a
123456
45
abc
ddd

示例输出

1
4
-1

提示

 

来源

cjx

示例程序

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #define h 1000001  
  4. char str1[h],str2[h];  
  5. int next[h];  
  6. void getnext(char str[h])  
  7. {  
  8.     int i  = 0;  
  9.     int len = strlen(str);  
  10.     next[0] = -1;  
  11.     int j = -1;  
  12.     while(i < len-1)  
  13.     {  
  14.         if( j == -1 || str[i] == str[j])  
  15.         {  
  16.             ++i;  
  17.             ++j;  
  18.             if( str[i]!= str[j])  
  19.                 next[i] = j;  
  20.             else  
  21.                 next[i] = next[j];  
  22.         }  
  23.         else  
  24.             j = next[j];  
  25.     }  
  26. }  
  27.   
  28. int KMP(char s1[h],char s2[h])  
  29. {  
  30.     getnext(s2);  
  31.     int len1 = strlen(s1);  
  32.     int len2 = strlen(s2);  
  33.     int i = 0;  
  34.     int j  = 0;  
  35.     while( i < len1 && j < len2)  
  36.     {  
  37.         if( j == -1 || s1[i] == s2[j])  
  38.         {  
  39.             ++i;  
  40.             ++j;  
  41.         }  
  42.         else  
  43.             j = next[j];  
  44.     }  
  45.     if( j >= len2)  
  46.         return i-len2+1;  
  47.     else  
  48.         return -1;  
  49. }  
  50. int main()  
  51. {  
  52.         int m;  
  53.         while(scanf("%s",str1)!=EOF)  
  54.         {  
  55.             scanf("%s",str2);         
  56.          m = KMP(str1,str2);  
  57.         printf("%d\n",m);  
  58.         }  
  59.         return 0;  
  60. }  
  61.   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤心丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值