21xrx.com
2024-12-26 00:40:26 Thursday
登录
文章检索 我的文章 写文章
C语言实现KMP算法的方法
2023-10-26 02:38:47 深夜i     --     --
C语言 KMP算法 实现方法

KMP算法是一种高效的字符串匹配算法,在C语言中可以很方便地实现。本文将介绍如何使用C语言来实现KMP算法。

首先,我们需要了解KMP算法的原理。KMP算法通过构建一个部分匹配表(Partial Match Table)来实现字符串的快速匹配。部分匹配表中记录了每个位置的最长公共前后缀长度,用于进行匹配时的跳转。通过利用已知信息,KMP算法可以避免无效的比较,从而提高匹配的效率。

接下来,我们将编写一个函数来构建部分匹配表。函数的输入是待匹配的字符串,输出是一个整型数组,表示每个位置的最长公共前后缀长度。代码如下所示:


void buildMatchTable(char* pattern, int* matchTable) {

  int length = strlen(pattern);

  matchTable[0] = 0;

  int i = 1;

  int j = 0;

  while (i < length) {

    if (pattern[i] == pattern[j]) {

      matchTable[i] = j + 1;

      i++;

      j++;

    }

    else {

      if (j != 0) {

        j = matchTable[j - 1];

      }

      else {

        matchTable[i] = 0;

        i++;

      }

    }

  }

}

在这段代码中,我们首先将第一个位置的最长公共前后缀长度设为0。然后利用两个指针i和j进行比较。如果当前位置的字符匹配成功,我们将最长公共前后缀长度加1,并将指针i和j都向后移动一位。如果当前位置的字符匹配失败,我们根据部分匹配表中上一个位置的值来更新j的值,并将指针i向后移动一位。

接下来,我们可以编写主函数来实现字符串的匹配。代码如下所示:


int KMP(char* text, char* pattern) {

  int textLength = strlen(text);

  int patternLength = strlen(pattern);

  int matchTable[patternLength];

  buildMatchTable(pattern, matchTable);

  int i = 0;

  int j = 0;

  while (i < textLength) {

    if (text[i] == pattern[j]) {

      if (j == patternLength - 1)

        return i - j;

      

      else {

        i++;

        j++;

      }

    }

    else {

      if (j != 0) {

        j = matchTable[j - 1];

      }

      else {

        i++;

      }

    }

  }

  return -1;

}

在这段代码中,我们首先通过调用buildMatchTable函数来构建部分匹配表。然后利用两个指针i和j进行比较,如果当前位置的字符匹配成功,指针j向后移动一位;否则,根据部分匹配表中上一个位置的值来更新j的值。

最后,我们可以在主函数中调用KMP函数来进行字符串的匹配。代码如下所示:


int main() {

  char text[] = "ABABABABCABABABAABABACABABACABABACABABA";

  char pattern[] = "ABABAC";

  int position = KMP(text, pattern);

  if (position == -1) {

    printf("Pattern not found.\n");

  }

  else {

    printf("Pattern found at position: %d\n", position);

  }

  return 0;

}

在这段代码中,我们定义了一个待匹配的字符串text和一个模式字符串pattern。然后调用KMP函数来查找模式字符串在待匹配字符串中的位置。如果找到了模式字符串,我们将输出其在待匹配字符串中的位置;否则,输出"Pattern not found."。

综上所述,我们使用C语言成功地实现了KMP算法。通过构建部分匹配表和利用已知信息进行跳转,KMP算法可以提高字符串匹配的效率。希望这篇文章能够帮助读者更好地理解KMP算法的原理和实现方法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复