软件编程
位置:首页>> 软件编程>> C#编程>> c# 实现KMP算法的示例代码

c# 实现KMP算法的示例代码

作者:温暖如太阳  发布时间:2023-12-02 06:35:19 

标签: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();
}

来源:https://www.cnblogs.com/xtt321/p/14022697.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com