CODEVS 1204 寻找子串位置 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODEVS 1204 寻找子串位置 题解相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:http://codevs.cn/problem/1204/

题目描述 Description

给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置。

输入描述 Input Description

仅一行包含两个字符串a和b

输出描述 Output Description

仅一行一个整数

样例输入 Sample Input

abcd bc

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

字符串的长度均不超过100

Pascal用户请注意:两个字符串之间可能包含多个空格

 

分析:

KMP算法裸题。至于KMP算法的讲解...

安利朋友的博客

虽然朋友的KMP跟我并不一样(什么),反正KMP算法只要理解了原理背板子就好啦

 

AC代码:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio> 
 6 
 7 char a[1005],s[1005];
 8 int nxt[1005],len1,len2;
 9 
10 void calc_nxt()
11 {
12     int k = -1,j = 0;
13     nxt[0] = -1;
14     while(j < len2)
15     {
16         if(k == -1 || s[j] == s[k])
17         {
18             ++ k,++ j;
19             if(s[k] != s[j])
20                 nxt[j] = k;
21             else
22                 nxt[j] = nxt[k];
23         }
24         else
25             k = nxt[k];
26     }
27 }
28 
29 inline int KMP(int k)
30 {
31     int j = 0;
32     while(j < len1 && j < len2)
33     {
34         if(j == -1 || a[k] == s[j])
35             ++ k,++ j;
36         else
37             j = nxt[j];
38     }
39     if(j == len2) return k-j;
40     return -1;
41 }
42 
43 int main()
44 {
45     scanf("%s",a);
46     scanf("%s",s);
47     len1 = strlen(a),len2 = strlen(s);
48     calc_nxt();
49     printf("%d\\n",KMP(0)+1);
50     return 0;
51 }

 

 

以上是关于CODEVS 1204 寻找子串位置 题解的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1204 寻找子串位置

CODEVS1204寻找子串位置

[codevs 1204]寻找子串位置

codevs1204 寻找子串位置

codevs-1204

CodeVS1204 寻找字串位置