博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两种算法解决查找子串的问题:hdu1711
阅读量:5970 次
发布时间:2019-06-19

本文共 1461 字,大约阅读时间需要 4 分钟。

    今天开始了系统了解一下字符串相关的算法,学习到KMP算法感觉走不动了!看来这个算法难还真不虚啊!

    我学习算法还是沿袭老传统,通过ACM的题来实战!找到HDU上最朴素的查找子串问题,在网上搜索到了两种算法(KMP算法和BM算法)的源代码:

 KMP():

 
  1. #include<stdio.h> 
  2.  #include<string.h> 
  3.  int a[1000001],b[10001],next[10001],n,m; 
  4.   
  5.  void get_next(int c[]) 
  6.  { 
  7.  next[1]=0;   
  8.      int j=next[1];       
  9.      for(int i=2;i<=m;i++)       
  10.      {       
  11.          while(j>0&&c[i]!=c[j+1]) j=next[j];       
  12.          if(c[i]==c[j+1]) j++;       
  13.          next[i]=j;       
  14.      } 
  15.  } 
  16.   
  17.   
  18.  void find() 
  19.  { 
  20.  get_next(b); 
  21.  int j=next[1];       
  22.      for(int i=1;i<=n;i++)       
  23.      {       
  24.          while(j>0&&a[i]!=b[j+1]) j=next[j];       
  25.          if(a[i]==b[j+1]) j++;       
  26.          if(j==m)       
  27.          {       
  28.              printf("%d\n",i-m+1);       
  29.              return;     
  30.          }       
  31.      } 
  32.  printf("-1\n"); 
  33.  } 
  34.   
  35.  int main() 
  36.  { 
  37.  int t,i,j; 
  38.  scanf("%d",&t); 
  39.  while(t--) 
  40.  { 
  41.     scanf("%d %d",&n,&m); 
  42.     for(i=1;i<=n;i++) 
  43.      scanf("%d",&a[i]); 
  44.     for(i=1;i<=m;i++) 
  45.      scanf("%d",&b[i]); 
  46.     find(); 
  47.  } 
  48.  return 0; 
  49.  } 
  50.   

BM():

 
  1. #include <iostream> 
  2.  #include <cstring> 
  3.  using namespace std; 
  4.  #define MM 1000005 
  5.  int s1[MM],s2[MM]; 
  6.  int ns1,ns2; 
  7.  int Dist(int *t,int ch) 
  8.  { 
  9.      int len = ns2; 
  10.      int i = len - 1; 
  11.      if(ch == t[i]) 
  12.        return len; 
  13.      i--; 
  14.      while(i >= 0) 
  15.      { 
  16.        if(ch == t[i]) 
  17.           return len - 1 - i; 
  18.        else 
  19.           i--; 
  20.      } 
  21.      return len; 
  22.  } 
  23.   
  24.  int BM(int *s,int *t) 
  25.  { 
  26.      int n = ns1; 
  27.      int m = ns2; 
  28.      int i = m-1; 
  29.      int j = m-1; 
  30.      while(j>=0 && i<n) 
  31.      { 
  32.         if(s[i] == t[j]) 
  33.         { 
  34.             i--; 
  35.             j--; 
  36.         } 
  37.         else 
  38.         { 
  39.             i += Dist(t,s[i]); 
  40.             j = m-1; 
  41.         } 
  42.      } 
  43.      if(j < 0) 
  44.      { 
  45.          return i+1; 
  46.      } 
  47.      return -1; 
  48.  } 
  49.   
  50.  int main() 
  51.  { 
  52.     int t; 
  53.     scanf("%d",&t); 
  54.     while(t--){ 
  55.         scanf("%d %d",&ns1,&ns2); 
  56.         int i; 
  57.         for(i=0;i<ns1;i++){ 
  58.             scanf("%d",&s1[i]); 
  59.   
  60.         } 
  61.         for(i=0;i<ns2;i++){ 
  62.             scanf("%d",&s2[i]); 
  63.   
  64.         } 
  65.         int ans=0; 
  66.         ans=BM(s1,s2); 
  67.         if(ans!=-1){ 
  68.             ans+=1; 
  69.         } 
  70.          cout<<ans<<endl; 
  71.     } 
  72.   
  73.   
  74.      return 0; 
  75.  } 
  76.   

   不懂没关系,先收着,再慢慢研究!

 

转载地址:http://kwwox.baihongyu.com/

你可能感兴趣的文章
为数据库建立索引
查看>>
第二周作业-软件工作量的估计
查看>>
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
[Linux][Redis][05]Benchmark
查看>>
第一次作业-准备篇
查看>>
HDU1848 Fibonacci again and again
查看>>
HTML思维导图
查看>>
git改密码出现授权问题
查看>>
ORA-02266: 表中的唯一/主键被启用的外键引用
查看>>
Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法
查看>>
day-6 and day-7:面向对象
查看>>
CSU Double Shortest Paths 湖南省第十届省赛
查看>>
webgl像机世界
查看>>
php正则怎么使用(最全最细致)
查看>>
javascript数学运算符
查看>>
LC.155. Min Stack(非优化,两个stack 同步 + -)
查看>>
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
Android创建启动画面
查看>>