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

字符串匹配算法(BF算法&&KMP算法)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)