数据结构&算法-KMP匹配算法
Posted 彩色墨水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法-KMP匹配算法相关的知识,希望对你有一定的参考价值。
运行结果
代码
using System;
namespace KMPAlgorithm
class Program
static void Main(string[] args)
string mainstr = "acdeebfgracacdacdefg";
string patternstr = "dacdef";
Console.WriteLine("=========普通匹配算法结果============");
int norindex = MatchStr(mainstr, patternstr);
Console.WriteLine("普通第一次匹配到的索引:" + norindex);
Console.WriteLine("=========KMP算法结果============");
int index = KMP(mainstr, patternstr);
Console.WriteLine("KMP第一次匹配到的索引:" + index);
/// <summary>
/// 普通匹配算法
/// </summary>
/// <param name="mainstr">主串</param>
/// <param name="patternstr">模式串</param>
/// <returns></returns>
static int MatchStr(string mainstr, string patternstr)
int matchIndex = -1;
if (mainstr.Length < patternstr.Length)
return matchIndex;
bool ismatch = false;
for (int i = 0; i < mainstr.Length - patternstr.Length + 1; i++) //n-m
for (int j = 0; j < patternstr.Length; j++) //m
if (patternstr[j] == mainstr[i + j])
ismatch = true;
else
ismatch = false;
break;
if (ismatch)
matchIndex = i;
break;
return matchIndex;
/// <summary>
/// KMP匹配算法
/// </summary>
/// <param name="mainstr">主串</param>
/// <param name="patternstr">模式串</param>
/// <returns></returns>
static int KMP(string mainstr, string patternstr)
int[] next = new int[patternstr.Length];
GetNext(patternstr, ref next);
int i = 0, j = 0;
while (i <= mainstr.Length && j <= patternstr.Length)
if (j == 0 || mainstr[i - 1] == patternstr[j - 1]) i++; j++;
else j = next[j]; i++;
if (j > patternstr.Length) return i - patternstr.Length - 1;
else return -1;
/// <summary>
/// 求next数组
/// </summary>
/// <param name="T">模式串</param>
/// <param name="next">next数组</param>
static void GetNext(string T, ref int[] next)
next[0] = 1;
if (next.Length > 1)
next[1] = 1;
int mispair = 2;//错配项开始的下标
int p = 1;//错配项的顶配差额
int i = 1;//错配项的前i个位置
for (; mispair < T.Length; mispair++)//m的量级
next[mispair] = 1;
while (mispair - i - p >= 0)//一直到错配项匹配到头部才能出来 共O(m²)的量级
if (T[mispair - i] == T[mispair - i - p])//从错配项前一个位置开始往前匹配,假如能匹配继续往前移动
if (mispair - i - p == 0)//说明匹配到头部了,完成匹配
next[mispair] = mispair - p + 1;
break;
else
i++;
else// 这个匹配数量失败了,则错配项的顶配数量减少
p++;
i = 1;
continue;
以上是关于数据结构&算法-KMP匹配算法的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 17 KMP 算法
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 17 KMP 算法
数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)