• <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)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产亚洲αv忘忧草| 精品久久久噜噜噜久久久| 国产亚洲美女精品久久久| 久久www免费人成精品香蕉| 伊人久久一区二区三区无码| 日产精品久久久久久久| 99久久人妻无码精品系列蜜桃| 狠狠色丁香婷婷综合久久来| 日韩va亚洲va欧美va久久| 看久久久久久a级毛片| 91麻豆精品国产91久久久久久| 伊人久久大香线蕉无码麻豆| 久久99精品国产| 精品伊人久久大线蕉色首页| 色综合久久天天综合| 亚洲国产精品无码久久98| 久久人妻少妇嫩草AV无码蜜桃| 久久久久国产精品熟女影院| 久久久久亚洲AV成人网人人网站 | 国内精品久久久久影院优| 日韩欧美亚洲国产精品字幕久久久 | 天堂无码久久综合东京热| 97久久久久人妻精品专区| 思思久久99热免费精品6| 青青青国产成人久久111网站| 色综合久久无码中文字幕| 日日狠狠久久偷偷色综合96蜜桃| 国产成人久久AV免费| 久久亚洲欧美国产精品 | 97精品伊人久久大香线蕉app| 97精品伊人久久大香线蕉| 色综合久久久久综合99| 成人午夜精品久久久久久久小说| 亚洲国产精品婷婷久久| 久久av无码专区亚洲av桃花岛| 亚洲精品97久久中文字幕无码| 国产综合精品久久亚洲| 成人午夜精品久久久久久久小说| 一本一道久久a久久精品综合| 久久久久精品国产亚洲AV无码| 91精品国产9l久久久久|