一江春水向東流

          做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

          KMP算法的關鍵是根據給定的模式串W[1,m],定義一個next函數。next函數包含了模式串本身局部匹配的信息。
          ?? KMP算法的基本思想是:假設在模式匹配的進程中,執行T[i]和W[j]的匹配檢查。若T[i]=W[j],則繼續檢查T[i+1]和W[j+1]是否匹配。若T[i]<>W[j],則分成兩種情況:若j=1,則模式串右移一位,檢查T[i+1]和W[1]是否匹配;若1<j<=m,則模式串右移j-next(j)位,檢查T[i]和W[next(j)]是否匹配。重復此過程直到j=m或i=n結束。

          /**************************************
          ?*
          ?*? KMP字符串匹配算法
          ?*
          ?*
          ?**************************************/
          #include <stdio.h>
          #include <string.h>
          int next[10];
          void getnext(char *p)
          {
          ?int idx_p, len_p, k;
          ?
          ?idx_p = 0;
          ?len_p = strlen(p);
          ?k = -1;
          ?next[0] = -1;
          ?
          ?while(idx_p < len_p -1)
          ?{
          ? if ((k == -1) || *(p+idx_p) == *(p+k))
          ? {
          ?? idx_p = idx_p + 1;
          ?? k = k + 1;
          ?? next[idx_p] = k;
          ? }
          ? else
          ? {
          ?? k = next[k];
          ? }
          ?}
          }
          int kmp(char *s, char *p)
          {
          ?int len_p, len_s, idx_p, idx_s;
          ?
          ?len_p = strlen(p);
          ?len_s = strlen(s);
          ?idx_p = idx_s = 0;
          ?
          ?while ((idx_p < len_p) && (idx_s < len_s))
          ?{
          ? /* 字符匹配或者要比較p中的第一個字符 */
          ? if ((idx_p == -1) || *(p+idx_p) == *(s+idx_s))
          ? {
          ?? idx_p = idx_p + 1; idx_s = idx_s +1;
          ? }
          ? else
          ? {
          ?? idx_p = next[idx_p];
          ? }
          ?}
          ?if (idx_p >= len_p)
          ?{
          ? return (idx_s - len_p);
          ?}
          ?else
          ?{
          ? return -1;
          ?}
          }
          int main()
          {
          ?int pos, i;
          ?char s[50] = "abaaaabcabcacb";
          ?char p[10] = "aaaabca";
          ?
          ?getnext(p);
          ?if ((pos = kmp(s, p)) == -1)
          ?{
          ? fprintf(stderr, "String \"%s\" doesn't contain Pattern \"%s\"!\n", s, p);
          ?}
          ?else
          ?{
          ? printf("String \"%s\" contains Pattern \"%s\".\n The position of fisrt occur is %d\n", s, p, pos);
          ? printf("%s\n", s);
          ? for (i = 0; i < pos; i++)
          ?? printf(" ");
          ? printf("%s\n", p);
          ?}
          ?return 0;
          }

          posted on 2007-04-29 15:52 allic 閱讀(1279) 評論(0)  編輯  收藏 所屬分類: 算法及數據結構
          主站蜘蛛池模板: 垫江县| 元朗区| 女性| 唐河县| 乌鲁木齐市| 乐平市| 永昌县| 阜城县| 乡宁县| 西宁市| 曲靖市| 左权县| 广安市| 婺源县| 山西省| 武隆县| 中阳县| 遵义市| 阜新市| 收藏| 南召县| 韩城市| 孙吴县| 绵阳市| 吕梁市| 姜堰市| 牟定县| 游戏| 托克托县| 蛟河市| 桑植县| 佛坪县| 礼泉县| 区。| 白沙| 晋宁县| 荆门市| 定南县| 厦门市| 凌海市| 延寿县|