• <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 閱讀(617) 評論(0)  編輯 收藏 引用 所屬分類: 規律
            <2012年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品久久久久影院亚洲| 久久久精品无码专区不卡| 国内精品伊人久久久久777| 久久99精品久久久久子伦| 国内精品久久国产大陆| 久久久久国产精品麻豆AR影院| 四虎国产精品免费久久| 久久综合狠狠综合久久综合88 | 久久久WWW成人免费精品| 99久久免费只有精品国产| 国产精品美女久久久久AV福利| 2021国产精品午夜久久| 久久ZYZ资源站无码中文动漫| 国产精品狼人久久久久影院| 亚洲综合熟女久久久30p| 精品无码久久久久久国产| 亚洲日本va中文字幕久久| 色综合久久中文综合网| 色狠狠久久AV五月综合| 无码任你躁久久久久久老妇| avtt天堂网久久精品| 久久久久香蕉视频| 久久亚洲国产欧洲精品一| 东方aⅴ免费观看久久av| 久久精品无码av| 国产精品美女久久久久久2018| 精品熟女少妇AV免费久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 99久久这里只精品国产免费| 久久精品国产清自在天天线| 免费观看成人久久网免费观看| 久久精品人人做人人爽97| 亚洲精品无码久久久久久| 国产免费久久精品99re丫y| 久久婷婷色综合一区二区| 亚洲国产精品久久| 国产精品熟女福利久久AV| 久久久久国产精品麻豆AR影院 | 精品久久久久久久久久久久久久久| 国内精品久久久久久99蜜桃| 色欲综合久久躁天天躁蜜桃|