鱼C论坛

 找回密码
 立即注册
查看: 3802|回复: 6

KMP算法按照小甲鱼的算法加的主函数输出一直是0,求答疑

[复制链接]
发表于 2014-7-15 18:10:51 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>

typedef char* String;

void get_next( String T, int *next )
{
        int j = 0;
        int i = 1;
        next[1] = 0;

        while( i < T[0] )
        {
                if( 0 == j || T[i] == T[j] )
                {
                        i++;
                        j++;
                        if( T[i] != T[j] )
                        {
                                next[i] = j;
                        }
                        else
                        {
                                next[i] = next[j];
                        }
                }
                else
                {
                        j = next[j];
                }
        }
}

// 返回子串T在主串S第pos个字符之后的位置
// 若不存在,则返回0
int Index_KMP( String S, String T, int pos )
{
        int i = pos;
        int j = 1;
        int next[255];

        get_next( T, next );
       
        while( i <= S[0] && j <= T[0] )
        {
                if( 0 == j || S[i] == T[j] )
                {
                        i++;
                        j++;
                }
                else
                {
                        j = next[j];
                }
        }

        if( j > T[0] )
        {
                return i - T[0];
        }
        else
        {
                return 0;
        }
}

int main()
{
        char s[255]="7abcdefg";
        char t[255]="2cd";
        int k;
        k=Index_KMP(s,t,1);
        printf("%d",k);
}



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-18 17:47:04 | 显示全部楼层
这是JAVA的实现方法,你看一下:
  1. public class KMP
  2. {
  3.         public static int[] preProcess(char[] B)
  4.         {
  5.                 int size = B.length;
  6.                 int[] P = new int[size];   //给模式匹配串添加一个P数组
  7.                 P[0] = 0;                  //也将就是KMP算法中非著名的next数组
  8.                 int j = 0;                 //它指导者模式匹配串下一步改用第几号元素去进行匹配

  9.                 for (int i=1; i < size; i++ )   //j为前缀标号  i为后缀标号
  10.                 {
  11.                         while (j>0 && B[j] != B[i] )
  12.                         {
  13.                                 j = P[j];
  14.                         }
  15.                         if (B[j] == B[i])
  16.                         {
  17.                                 j++;
  18.                         }
  19.                         P[i] = j;
  20.                 }
  21.                 return P;
  22.         }

  23.         public static void kmp(String parStr, String subStr )   //kmp算法的实现
  24.         {
  25.                 int subSize = subStr.length();   //子串
  26.                 int parSize = parStr.length();   //主串
  27.                 char[] B = subStr.toCharArray();
  28.                 char[] A = parStr.toCharArray();
  29.                 int[] P = preProcess(B);
  30.                 int j = 0;
  31.                 int k = 0;

  32.                 for (int i=0; i < parSize; i++ )
  33.                 {
  34.                         while (j > 0 && B[j] != A[i] )
  35.                         {
  36.                                 j = P[j-1];
  37.                         }

  38.                         if (B[j] == A[i])
  39.                         {
  40.                                 j++;
  41.                         }

  42.                         if (j == subSize)
  43.                         {
  44.                                 j = P[j-1];
  45.                                 k++;
  46.                                 System.out.printf("Find subString '%s' at %d\n", subStr, i-subSize+1);
  47.                         }
  48.                 }
  49.                 System.out.printf("Totally found %d times for '%s'.\n\n", k, subStr);
  50.         }
  51.         public static void main(String args[])
  52.         {
  53.                 kmp("abcdeg, abcdeh, abcdef!", "abcdef");

  54.                 kmp("测试汉字的匹配,小白马","小白马");
  55.         }
  56. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-12 21:07:21 | 显示全部楼层
因为若不存在,则返回 0,"7abcdefg"里没有"2cd";
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-22 12:51:08 From FishC Mobile | 显示全部楼层
按你那样设置,j永远不可能大于T0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-23 23:06:30 | 显示全部楼层
whdd 发表于 2019-4-22 12:51
按你那样设置,j永远不可能大于T0

那该怎样改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-5 12:49:25 | 显示全部楼层
char t[255]="2cd"中t[0]实际上是50,因为2的ASCII码是50
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 18:26:33 | 显示全部楼层
本帖最后由 SmithDimon 于 2020-3-19 19:56 编辑

准却来说就是ASCII码的问题
你只要在你定义完字符串后加上
s[0]=s[0]-48;
t[0]=t[0]-48;
就Ok了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 05:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表