Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31729
  • 博文数量: 9
  • 博客积分: 177
  • 博客等级: 入伍新兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-11 19:12
文章分类

全部博文(9)

文章存档

2011年(9)

我的朋友
最近访客

分类: C/C++

2011-05-05 22:31:52

char p[]="abc"; char str[]="aabcd"
1 朴素算法
void naive_string_match(char T[],char P[])//模式P(要匹配的字符串)
{
        int n = strlen(T);
        int m = strlen(P);
        int i=0,j=0;
        for(i=0;i        {
                for(j=0;j                {
                        if(T[i+j]!=P[j]) break;
                }
                if(j==m&(T[i+m-1]==P[m-1])){printf("T matches P\n");i=i+m-1;}
        }
}
2Rabin-Karp算法
//将字符串变成数字的形式
void rabin_karp(char T[],char P[])
{
        int n =strlen(T);
        int m =strlen(P);
        int a=1,i=0,b=1,j=0;
        //a=1,b=2,c=3......
        for(i=0;i                a=a*(P[i]-'a'+1);
                b=b*(T[i]-'a'+1);
        }

        for(i=0;i        {
                if(a==b){
                        for(j=0;j                        {
                                if(T[i+j]!=P[j]) break;
                        }
                        if(j==m&(T[i+m-1]==P[m-1])) printf("T matches P\n");
                }
                b=b/(T[i]-'a'+1)*(T[i+m]-'a'+1);
        }
}
3有限自动机
1>状态集合 2>一个起始状态 3>多个终止状态 4>输入的集合 5>转移函数
转移函数 
#define LENGTH sizeof(p)-1
char p[] = "abcd";//要匹配的字符串
int count=4;//字符种类,构造自动机用 
int Q[LENGTH][4];//状态转移数组 
void finite_auto_maching()
{    
     int i = 0,j=0,k=0,z=0,t=0;
     memset(Q,0,sizeof(Q));
     for(i=0;i
     {
         for(j=0;j
         {
             if(p[i] == ('a'+j))
             {
                  Q[i][j] = i+1;
             }else 
             {
                  t=0,k=0;
                  while(t
                  Q[i][j] = k;
             }  
         }       
     }    
}

4 KMP算法
#include
#include

char p[] = "abcabca";
int count=0;
int t[sizeof(p)-1];//p后缀的最长前缀 

void kmp()
{
    int i=0,k=0;
    memset(t,0,sizeof(t)); 
    for(i=1;i
    {   
        k = t[i-1];
        while(p[k]!= p[i]&&k!=0) k=t[k];  
        if(p[k]== p[i])
            t[i] = k+1;
        else t[i] = k;
    }          
}
int main()
{
     kmp();
     char a[]  = "ababcabcaabcabca";
     int i=0,k=0;
     for(i=0;i
     {
          while(a[i]!=p[k]&&k!=0) k = t[k-1];   
          if(p[k] == a[i] ) k = k+1;
          if(k==strlen(p)){ count++;k=0;} printf("%d\n",k);                     
     }
     printf("P出现次数:%d\n",count);
     system("pause");
     return 0;
}


阅读(1674) | 评论(2) | 转发(0) |
0

上一篇:淘宝笔试题:分鸡蛋

下一篇:使用qsort

给主人留下些什么吧!~~

cangt2011-05-09 09:24:03

还有一个kmp和自动机没总结,改天总结下

GFree_Wind2011-05-06 16:53:27

看到数字那个算法时,我还想溢出了咋办?但后面只有在数字相等的情况下再进行比较。不错。不过怎么没有KMP算法呢