• <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)  編輯 收藏 引用 所屬分類: 規律
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久国产精品| 国产aⅴ激情无码久久| 秋霞久久国产精品电影院| 久久线看观看精品香蕉国产| 狠狠综合久久综合中文88 | 久久精品无码专区免费青青| 精品久久久久久中文字幕大豆网 | 伊人久久无码中文字幕| 亚洲AV无码久久精品成人 | 性做久久久久久久久| 久久棈精品久久久久久噜噜| 欧美综合天天夜夜久久| 久久亚洲日韩看片无码| 亚洲嫩草影院久久精品| 99蜜桃臀久久久欧美精品网站 | 久久99热国产这有精品| 精品国产乱码久久久久久呢 | 国产一区二区三精品久久久无广告| 国产精品久久久久久久久久影院| 国产午夜久久影院| 综合久久国产九一剧情麻豆| 激情综合色综合久久综合| av无码久久久久久不卡网站| 久久午夜伦鲁片免费无码| 色婷婷噜噜久久国产精品12p| 欧美亚洲国产精品久久蜜芽| 精品熟女少妇av免费久久| 久久精品国产亚洲AV香蕉| 欧美日韩成人精品久久久免费看| 日本免费久久久久久久网站| 久久精品国产亚洲av水果派| 99久久99久久精品国产片果冻 | 亚洲成色WWW久久网站| 热99RE久久精品这里都是精品免费 | 久久久久亚洲AV无码网站| 国产偷久久久精品专区| 国产精品一区二区久久精品涩爱 | 精品久久久久久综合日本| 久久本道伊人久久| 国产99久久久国产精免费| 久久免费视频网站|