模式匹配
来源:互联网 发布:网络摄像机软件下载 编辑:程序博客网 时间:2024/06/08 08:39
描述:
求一个字符串在另一个字符串中的位置,称为模式匹配,如果匹配成功,则输出第一次匹配成功的位置,否则输出0。KMP算法是一种高效的模式匹配算法。要求采用KMP算法完成该题目。
输入:
输入包今含若干个测试用例,每个测试用例占两行,其中第一行为目标字符串,第二行为模式串。
输出:
对每个测试用例,用两行输出,其中第一行输出该用例的模式串的各字符的next值,第二行输出模式串在目标串中第一次匹配成功的位置。如果匹配不成功,则输出0。
样例输入:
abcdefg
bcd
0000001
0001
110011001100
111
dabcabcabc
abc
样例输出:
0 1 1
2
0 1 2 3
4
0 1 2
0
0 1 1
2
代码如下:
#include <stdio.h>#include <string.h>void get_next(char *str,int len,int *next){ next[0] = 0; next[1] = 1; int k = 0; for(int i=2; i<len; i++) { k = next[i-1]; while(k>1 && str[i-1]!=str[k-1]) k = next[k]; if(str[i-1] == str[k-1]) next[i] = k+1; else next[i] = 1; }}void print_next(int *next,int len){ for(int i=0; i<len; i++) printf("%d ",next[i]); printf("\n");}int KMP(char *str,int slen,char *vision,int len,int *next){ int j = 0; for(int i=0; i<slen; i++) { while(j>0 && str[i] != vision[j]) j = next[j]-1; if(str[i] == vision[j]) j++; if(j==len) return i-len+1; } return -1;}int main(){ char str[100],vision[100]; int slen,len,next[100]; while(scanf("%s%s",&str,&vision)!=EOF) { len = strlen(vision); slen = strlen(str); get_next(vision,len,next); print_next(next,len); printf("%d\n",1+KMP(str,slen,vision,len,next)); } return 0;}
阅读全文
0 0
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- 模式匹配
- efi
- 动物声音模拟器
- 存储过程调用
- must,must_not,should组合关系以及OR和AND
- C++ 语言:char 转换成 bit
- 模式匹配
- open.c源代码阅读
- elasticsearch-段合并
- Lagrange插值多项式
- 设置Android Studio错误提示
- 快速排序
- openVswitch(OVS)源代码分析之简介
- android-O RescueParty 介绍
- Vue、angular的URL地址编写方式