我是靠谱客的博主 愉快玫瑰,最近开发中收集的这篇文章主要介绍c# 实现KMP算法的示例代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) 。
实现方式就不再这里献丑了,网上很多讲解,此处只是记录下c#实现的代码。

public class KMP
{
  public static int[] GetNext(String ps)
  {
    char[] p = ps.ToArray();
    int[] next = new int[p.Length];
    next[0] = -1;
    int j = 0;
    int k = -1;
    while (j < p.Length - 1)
    {
      if (k == -1 || p[j] == p[k])
      {
        next[++j] = ++k;
      }
      else
      {
        k = next[k];
      }
    }
    return next;
  }

  public static int GetIndex(String ts, String ps)
  {
    char[] t = ts.ToArray();
    char[] p = ps.ToArray();
    int i = 0; // 主串的位置
    int j = 0; // 模式串的位置
    int[] next = GetNext(ps);
    while (i < t.Length && j < p.Length)
    {
      if (j == -1 || t[i] == p[j])
      { 
        // 当j为-1时,要移动的是i,当然j也要归0
        i++;
        j++;
      }
      else
      {
        // i不需要回溯了
        // i = i - j + 1;
        j = next[j]; // j回到指定位置
      }
    }

    if (j == p.Length)
    {
      return i - j;
    }
    else
    {
      return -1;
    }
  }
}

//test
static void Main(string[] args)
{
  Console.WriteLine( KMP.GetIndex("abcdbcxdbc", "dbc"));
  Console.ReadKey();
}

以上就是c# 实现KMP算法的示例代码的详细内容,更多关于c# kmp算法的资料请关注靠谱客其它相关文章!

最后

以上就是愉快玫瑰为你收集整理的c# 实现KMP算法的示例代码的全部内容,希望文章能够帮你解决c# 实现KMP算法的示例代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(95)

评论列表共有 0 条评论

立即
投稿
返回
顶部