• <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)  編輯 收藏 引用 所屬分類: 規律
            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            伊人久久综合成人网| 久久电影网| 国产麻豆精品久久一二三| 久久www免费人成看片| 国产三级久久久精品麻豆三级| 国产精品久久毛片完整版| 久久久久亚洲av毛片大| 久久亚洲欧美国产精品| 国产精品久久久久一区二区三区| 久久亚洲精品国产精品婷婷| 国产精品禁18久久久夂久| 香蕉久久久久久狠狠色| 久久久久免费精品国产 | 色欲综合久久中文字幕网| 日本精品久久久中文字幕| 少妇熟女久久综合网色欲| 婷婷久久综合九色综合98| 少妇久久久久久被弄高潮| 青青草原综合久久大伊人| 久久精品无码一区二区三区免费| 精品久久久久久亚洲精品| 无码八A片人妻少妇久久| 久久性生大片免费观看性| 国内精品久久久久久久久| 久久er国产精品免费观看2| 久久综合精品国产二区无码| 99精品国产综合久久久久五月天 | 精品久久综合1区2区3区激情| 久久Av无码精品人妻系列 | 国产精品日韩深夜福利久久| 99精品久久精品一区二区| 久久精品国产亚洲AV无码麻豆 | 国产精品99久久久久久人| 国产V亚洲V天堂无码久久久| 人妻少妇久久中文字幕 | 亚洲国产精品久久电影欧美| 久久久久亚洲精品日久生情| 久久婷婷国产剧情内射白浆| 香蕉久久夜色精品国产2020| 无码精品久久久久久人妻中字| 伊人久久精品无码av一区|