数据结构&算法-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算法)