<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 251  文章 - 504  trackbacks - 0
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    本博客系個人收集材料及學習記錄之用,各類“大俠”勿擾!

    留言簿(14)

    隨筆分類

    收藏夾

    My Favorite Web Sites

    名Bloger

    非著名Bloger

    搜索

    •  

    積分與排名

    • 積分 - 204326
    • 排名 - 283

    最新評論

    1、建立目標串s和模式串t
    2、采用簡單算法求t在s中的位置
    3、由模式串t求出next值和nextval值
    4、采用KMP算法和KMP改進算法求t在s中的位置

    代碼如下:
    #include<stdio.h>
    #include<string.h>
    #define MaxSize 100

    typedef struct
    {
    ?char ch[MaxSize];
    ?int len;
    }SqString;

    int Index(SqString s,SqString t)/* 簡單匹配方法*/
    {
    ? int i=0,j=0,k;
    ? while(i<s.len&&j<t.len)
    ? {
    ??? if(s.ch[i]==t.ch[j])/*繼續(xù)匹配下一個字符*/
    ?{
    ?? i++;
    ?? j++;
    ?}
    ?else/*子串、主串的指針回溯重新開始下一次匹配*/
    ?{
    ? i=i-j+1;
    ? j=0;
    ?}
    ? }
    ? if(j>=t.len)/*匹配成功,返回匹配的第一個字符下標*/
    ?? k=i-t.len;
    ? else/*匹配不成功*/
    ?? k=-1;
    ? return k;
    }

    void GetNext(SqString t,int next[])/*由模式串t求出next值*/
    {
    ?int j,k;
    ?j=0;k=-1;next[0]=-1;
    ?while(j<t.len-1)
    ?{
    ?? if(k==-1||t.ch[j]==t.ch[k])
    ?? {
    ???? j++;k++;
    ???? next[j]=k;
    ?? }
    ?? else k=next[k];
    ?}
    }

    void GetNextval(SqString t,int nextval[])/*由模式串t求出nextval值*/
    {
    ?? int j=0,k=-1;
    ?? nextval[0]=-1;
    ?? while(j<t.len)
    ?? {
    ??? if(k==-1||t.ch[j]==t.ch[k])
    ??? {
    ????? j++;k++;
    ?? if(t.ch[j]!=t.ch[k])
    ??
    ??? nextval[j]=k;
    ?? else
    ?????? nextval[j]=nextval[k];

    ?? }
    ?? else k=nextval[k];
    ???
    ?? }
    }
    int KMPIndex(SqString s,SqString t)/*KMP算法*/
    {
    ?? int next[MaxSize];
    ?? int i=0,j=0;
    ?? int v;
    ?? GetNext(t,next);
    ?? while(i<s.len && j<t.len)
    ?? {
    ???? if(j==-1||s.ch[i]==t.ch[j])
    ???? {
    ???? ?i++;
    ???? ?j++;
    ?? }
    ?? else j=next[j];
    ?? }
    ?? if(j>=t.len)
    ?? v=i-t.len;
    ?? else
    ?? v=-1;
    ?? return v;
    }

    int KMPIndex1(SqString s,SqString t)/*改進的KMP算法*/
    {
    ?int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
    ?GetNextval(t,next);
    ?GetNextval(t,nextval);
    ?while(i<s.len&&j<t.len)
    ?{
    ? if(i==-1||s.ch[i]==t.ch[j])
    ? {
    ??? i++;
    ?j++;
    ? }
    ? else j=nextval[j];
    ?}
    ?if(j>=t.len)
    ? v=i-t.len;/*返回匹配模式串的首字符下標*/
    ?else
    ? v=-1;
    ?return v;
    }

    void StrAssign(SqString &str,char cstr[])/*由串常量cstr創(chuàng)建串str */
    {
    ?? int i;
    ?? for(i=0;cstr[i]!='\0';i++)
    ??? str.ch[i]=cstr[i];
    ?? str.len=i;
    }

    void DispStr(SqString s)/*輸出串s的所有元素*/
    {
    ? int i;
    ? if(s.len>0)
    ? {
    ??? for(i=0;i<s.len;i++)
    ??printf("%c",s.ch[i]);
    ?printf("\n");
    ? }
    }
    void main()
    {
    ? int j;
    ? int next[MaxSize],nextval[MaxSize];
    ? SqString s,t;
    ? StrAssign(s,"abcabcdabcdeabcdefabcdefg");
    ? StrAssign(t,"abcdeabcdefab");
    ? printf("串s:");DispStr(s);
    ? printf("串t:");DispStr(t);

    ? printf("簡單匹配P算法:\n");
    ? printf("t在s中的位置:%d\n",Index(s,t));

    ? GetNext(t,next);
    ? GetNextval(t,nextval);
    ? printf(" j???? ");
    ? for(j=0;j<t.len;j++)
    ? {
    ?? printf("%4d",j);
    ? }
    ? printf("\n");
    ? printf("t[j]?? ");
    ? for(j=0;j<t.len;j++)
    ? printf("%4c",t.ch[j]);
    ? printf("\n");
    ? printf("next?? ");
    ? for(j=0;j<t.len;j++)
    ? printf("%4d",next[j]);
    ?? printf("\n");
    ??
    ?? printf("nextval");
    ?? for(j=0;j<t.len;j++)
    ?? printf("%4d",nextval[j]);
    ?? printf("\n");

    ?? printf("KMP算法:\n");
    ?? printf("t在s中的位置:%d\n",KMPIndex(s,t));

    ?? printf("改進的KMP算法:\n");
    ?? printf("t在s中的位置:%d\n",KMPIndex1(s,t));

    }

    結(jié)果如下:
    串s:abcabcdabcdeabcdefabcdefg
    串t:abcdeabcdefab
    簡單匹配P算法:
    t在s中的位置:7
    ?j??????? 0?? 1?? 2?? 3?? 4?? 5?? 6?? 7?? 8?? 9? 10? 11? 12
    t[j]????? a?? b?? c?? d?? e?? a?? b?? c?? d?? e?? f?? a?? b
    next???? -1?? 0?? 0?? 0?? 0?? 0?? 1?? 2?? 3?? 4?? 5?? 0?? 1
    nextval? -1?? 0?? 0?? 0?? 0? -1?? 0?? 0?? 0?? 0?? 5? -1?? 0
    KMP算法:
    t在s中的位置:7
    改進的KMP算法:
    t在s中的位置:7

    posted on 2006-10-31 18:50 matthew 閱讀(1500) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法設計
    主站蜘蛛池模板: 最近最好最新2019中文字幕免费| 亚洲国产精品无码久久九九大片| 一进一出60分钟免费视频| 成人免费看片又大又黄| 亚洲中文字幕久久精品无码VA| 精品免费久久久久久久| 亚洲黄网站wwwwww| 57pao一国产成视频永久免费| 亚洲一区二区三区四区在线观看| 69影院毛片免费观看视频在线| 亚洲av日韩av激情亚洲| 99久9在线|免费| 亚洲AV成人无码天堂| 免费看韩国黄a片在线观看| 亚洲精品无码久久久久牙蜜区| 国产成人一区二区三区免费视频| 色多多免费视频观看区一区| 亚洲 自拍 另类小说综合图区| 男女猛烈无遮掩视频免费软件| 国产AⅤ无码专区亚洲AV| 一个人免费视频在线观看www | 亚洲一区二区高清| 黄色视频在线免费观看| 久久精品国产亚洲| 国产麻豆视频免费观看| 中文字幕无线码免费人妻| 亚洲AV中文无码乱人伦下载 | 久久久久亚洲AV无码专区首JN| 免费看黄视频网站| 亚洲av无一区二区三区| 在线a亚洲v天堂网2019无码| 中文字幕免费在线| 精品国产_亚洲人成在线| 4338×亚洲全国最大色成网站| 久久国产精品成人片免费| 亚洲国产精品精华液| 亚洲无人区午夜福利码高清完整版 | mm1313亚洲精品国产| 在线观看免费无码专区| 亚洲色www永久网站| 亚洲精品美女久久久久99小说|