Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144194
  • 博文数量: 66
  • 博客积分: 1571
  • 博客等级: 上尉
  • 技术积分: 715
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:55
文章分类

全部博文(66)

文章存档

2012年(66)

我的朋友

分类: C/C++

2012-07-17 09:42:51


 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include "string.h"
  3. //得到子串T的j每次回退的值
  4. void get_nextn(const char *T, int *nextn)
  5. {
  6.     int i,j;
  7.     int len;
  8.     i=1;
  9.     j=0;
  10.     nextn[1]=0; // 给出初始值
  11.     len=strlen(T);
  12.     while(i<len)
  13.     {
  14.      if(j==0||T[i]==T[j])
  15.      {
  16.          ++i;
  17.          ++j;
  18.          if(T[i]!=T[j])
  19.              nextn[i]=j;
  20.          else
  21.              nextn[i]=nextn[j]; //KMP算法改进的部分
  22.      }
  23.      else
  24.        j=nextn[j];
  25.    }
  26. }
  27. int Index_KMP(const char *S,const char *T,int pos)
  28. {
  29.  int i=pos;
  30.  int j=1;
  31.  int lenS,lenT;
  32.  int next[255];
  33.  get_nextn(T,next);
  34.  lenS=strlen(S);
  35.  lenT=strlen(T);
  36.  while(j<=lenT&&i<=lenS)
  37.  {
  38.   if(0==j||S[i]==T[j-1]) //字符串数组下表是从0开始的

  39.   {
  40.    ++i;
  41.    ++j;
  42.   }
  43.   else{
  44.    j=next[j];
  45.   }
  46.  }
  47.  if(j>lenT)
  48.  {
  49.    return i-lenT;
  50.  }
  51.     else
  52.     {
  53.   return 0;
  54.     }
  55. }
  56. int main()
  57. {
  58.  char *S="ijkabmndeddfdf";
  59.  char *T="abmn";
  60.  int pos=2;
  61.  int revalue;
  62.  revalue=Index_KMP(S,T,pos);
  63.  printf("%d\n",revalue);
  64. }


 

阅读(823) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~