kmp编码问题(c语言)

夙愿已清 提交于 2020-01-01 11:33:09

对于程序的语法报错问题,就是根据提示去找问题,不要自己瞎猜(猜的基本都是错的)

1.其中对于C语言的函数申明:extern int strStr(char * x, char * y)
如果根据提示查,根本就解决不了。
2.关于数据类型的不匹配问题也是需要根据提示来改正。

解决了语法编译的问题,但是还是不能输出结果:

#include <stdio.h>  
#include <string.h>
#include <stdlib.h>

extern int strStr(char * x, char * y);
extern int indexKMP(char *x, char *y,int z);

int main(){

  char * haystack = "sssdjiefon";
  char * needle = "st";
  int result = strStr(haystack,needle);

  return result;
}
int strStr(char * haystack, char * needle){

   int j =  indexKMP (haystack, needle, 1);
   return j;
    
}/**
数据结构中的伪代码是不符合语法的,一个char数组却在首部存了整个数组的长度(int类型)
*/

int * getnext(char* T,int *next){
    int length = strlen(T);
        next = (int *) malloc(sizeof(int)*length + 1);
        int i = 0;next[1] = 0; int j = 0;  //next[i]表示的是有待匹配的字符在字符串中的位置
        while(i < length){                   //设计上模式串是从下标为0的位置开始匹配的
            if(j == 0 || T[i] == T[j]){    //next[]的设计需要和KMP具体的匹配函数相匹配 (如果模式串的第一个字符就和主串匹配,主串和模式串都需要向右边转移)
                ++i;++j;next[i] = j;       //因为在设计上是模式串是从1开始的
                }
            else{
                j = next[j];              //告知模式串需要右移动的位数
            }
          }
          return next;
        }
    /**
    KMP算法的思路
    */
int indexKMP(char *S, char *T,int pos){
                 //需要利用T的next数组进行 利用模式串T的next函数求主串S中第pos个字符之后的位置
          int lengths = strlen(S);
          int lengtht = strlen(T);
          int *next =(int *) malloc(sizeof(int)*lengtht +1);
          next = getnext(S,next);
          int i = pos; int j = 1;
          while(i <= lengths && j <= lengtht ){
              if(j == 0 && S[i] == T[j]){
                  ++i;++j;
              }
              else{
                  j = next[j];
              }
              if(j > T[0]) return i-T[0];
              else return -1;
          }          
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!