• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 195,  comments - 30,  trackbacks - 0
            本文是結合劉大有主編《數據結構》所寫筆記,如果想學習kmp.推薦http://blog.csdn.net/china8848/archive/2008/04/29/2342243.aspx
            下面的估計我都看不懂
            #include<iostream>
            #include<cstdlib>
            #include<string>
            using namespace std;
            int f[100];
            void createf(string pat)//find數組
            {
             memset(f,0,sizeof(f));
             int m=pat.size();
             f[0]=-1;
             for(int j=1;j<m;j++)
             {
              int i=f[j-1];
              while(pat[j]!=pat[i+1]&&i>=0)//只要p[j]與p[i+1]不等,則遞推計算i
              i=f[i];
              if(pat[j]==pat[i+1])
              f[j]=i+1;
              else
              f[j]=-1;
             }
            }
            /*                        已知f[13]=6;acbacbcacbacb,求f[14]acbacbcacbacba則先判斷pat[6+1]是否等于pat[14],不等
                                            再判斷 i=f[6]acbacb=3;判斷pat[14]pat[3+1]相等,則i=3
                                       可得f[j]=3+1;         

            */
            int kmp(string pat,string str)//求pat在str中的第一個匹配的起點
            {
             int p=0,s=0;
             createf(pat);
             int m=pat.size();
             int n=str.size();
             while(p<m&&s<n)
             {
              if(pat[p]==str[s])
              {
               p++;s++;
              }
              else
              {
              if(p==0)s++;
              else
              p=f[p-1]+1;//s無需變化,舉例,abababababba
            /*                                                          |
                                                                         s指向a
                                                                 ababb
            //                                                           |
            //                                                           p指向b,s和p失配

                                                                abababababba
            //                                                          |
                                                                        s  s不變
              由于ab=ab,既f[p-1]=2               ababb
            //     p=f[p-1]+1=3                                |
            //                                                          p  回到f[p-1]+1的位置;


            相等,則s和p都加1.
            //
            */
            }
             }
                 if(p<m)
                 return -1;
                 return s-m;
            }

              int main()
              {
              //freopen("s.txt","r",stdin);
              //freopen("key.txt","w",stdout);
              cout<<kmp("fgfh","abcabfgfdhsfgfhdfdfhfcdab");//返回的是數組下標,從0開始
              getchar();
              //system("PAUSE");
              return   0;
              }

            改進的kmp
            ----------------------以下是原kmp生成next值的算法---------------------
            void createf(string pat)//find數組
            {
             memset(f,0,sizeof(f));
             int m=pat.size();
             f[0]=-1;
             for(int j=1;j<m;j++)
             {
              int i=f[j-1];
              while(pat[j]!=pat[i+1]&&i>=0)//只要p[j]與p[i+1]不等,則遞推計算i
              i=f[i];
              if(pat[j]==pat[i+1])
              f[j]=i+1;
              else
              f[j]=-1;
             }
            }
            /*                        已知f[13]=6;acbacbcacbacb,求f[14]acbacbcacbacba則先判斷pat[6+1]是否等于pat[14],不等
                                            再判斷 i=f[6]acbacb=3;判斷pat[14]pat[3+1]相等,則i=3
                                       可得f[j]=3+1;         

            */
            -------------------以下還是未改進kmp------------
            void get_next(String T,int &next[])
            {
              i=1;j=0;next[1]=0;
              while(i<=T.Length)
              {
                if(j==0 || T[i]==T[j]){++i;++j; next[i]=j;/**********(2)*/}
                else j=next[j];
              }
            }

            --------------------以下是改進型----------
            上面的f[j]相當于next[]
             int i,j,len,n;
                    len=strlen(s);
                    //KMP構造
                    i=0,j=-1;
                    next[0]=-1;
                    while(i<len)
                   {
                        if(j==-1||s[i]==s[j])
                       {
                            i++,j++;
                            if(s[i]!=s[j])
                               next[i]=j;                                                                     
                            else
                               next[i]=next[j];
                        //    printf("next[%d]=%d\n",i,next[i]);
                        }
                       else j=next[j];
                    }

            posted on 2009-06-30 14:12 luis 閱讀(619) 評論(0)  編輯 收藏 引用 所屬分類: 規律
            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久无码高潮喷水| 国产高潮国产高潮久久久91 | 色综合合久久天天综合绕视看| 午夜精品久久久久久毛片| 久久被窝电影亚洲爽爽爽| 伊人久久无码精品中文字幕| 久久久久亚洲AV无码麻豆| 久久精品亚洲乱码伦伦中文| 无码人妻精品一区二区三区久久久| 国产精品99久久99久久久| 欧美日韩中文字幕久久久不卡 | 久久中文娱乐网| 久久天天躁狠狠躁夜夜2020一| 91久久香蕉国产熟女线看| 欧美日韩精品久久免费| 91久久国产视频| 国产产无码乱码精品久久鸭| 精品久久久久久久国产潘金莲| 国产精品日韩欧美久久综合| 久久夜色精品国产欧美乱| 久久中文字幕人妻丝袜| 久久久WWW免费人成精品| 77777亚洲午夜久久多喷| 日韩人妻无码精品久久免费一| 美女久久久久久| 久久亚洲中文字幕精品一区| 国产精品久久久久久久午夜片 | 91秦先生久久久久久久| 久久精品欧美日韩精品| 婷婷久久香蕉五月综合加勒比| 久久久这里有精品| 欧美伊人久久大香线蕉综合69 | 国产精品丝袜久久久久久不卡| 久久精品国产第一区二区三区| 亚洲中文字幕久久精品无码喷水 | 国产91色综合久久免费| 日本人妻丰满熟妇久久久久久| 99久久国产宗和精品1上映 | 曰曰摸天天摸人人看久久久| 久久99精品国产| 久久WWW免费人成—看片|