本文共 1461 字,大约阅读时间需要 4 分钟。
今天开始了系统了解一下字符串相关的算法,学习到KMP算法感觉走不动了!看来这个算法难还真不虚啊!
我学习算法还是沿袭老传统,通过ACM的题来实战!找到HDU上最朴素的查找子串问题,在网上搜索到了两种算法(KMP算法和BM算法)的源代码:
KMP():
- #include<stdio.h>
- #include<string.h>
- int a[1000001],b[10001],next[10001],n,m;
-
- void get_next(int c[])
- {
- next[1]=0;
- int j=next[1];
- for(int i=2;i<=m;i++)
- {
- while(j>0&&c[i]!=c[j+1]) j=next[j];
- if(c[i]==c[j+1]) j++;
- next[i]=j;
- }
- }
-
-
- void find()
- {
- get_next(b);
- int j=next[1];
- for(int i=1;i<=n;i++)
- {
- while(j>0&&a[i]!=b[j+1]) j=next[j];
- if(a[i]==b[j+1]) j++;
- if(j==m)
- {
- printf("%d\n",i-m+1);
- return;
- }
- }
- printf("-1\n");
- }
-
- int main()
- {
- int t,i,j;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d %d",&n,&m);
- for(i=1;i<=n;i++)
- scanf("%d",&a[i]);
- for(i=1;i<=m;i++)
- scanf("%d",&b[i]);
- find();
- }
- return 0;
- }
-
BM():
- #include <iostream>
- #include <cstring>
- using namespace std;
- #define MM 1000005
- int s1[MM],s2[MM];
- int ns1,ns2;
- int Dist(int *t,int ch)
- {
- int len = ns2;
- int i = len - 1;
- if(ch == t[i])
- return len;
- i--;
- while(i >= 0)
- {
- if(ch == t[i])
- return len - 1 - i;
- else
- i--;
- }
- return len;
- }
-
- int BM(int *s,int *t)
- {
- int n = ns1;
- int m = ns2;
- int i = m-1;
- int j = m-1;
- while(j>=0 && i<n)
- {
- if(s[i] == t[j])
- {
- i--;
- j--;
- }
- else
- {
- i += Dist(t,s[i]);
- j = m-1;
- }
- }
- if(j < 0)
- {
- return i+1;
- }
- return -1;
- }
-
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--){
- scanf("%d %d",&ns1,&ns2);
- int i;
- for(i=0;i<ns1;i++){
- scanf("%d",&s1[i]);
-
- }
- for(i=0;i<ns2;i++){
- scanf("%d",&s2[i]);
-
- }
- int ans=0;
- ans=BM(s1,s2);
- if(ans!=-1){
- ans+=1;
- }
- cout<<ans<<endl;
- }
-
-
- return 0;
- }
-
不懂没关系,先收着,再慢慢研究!
转载地址:http://kwwox.baihongyu.com/