KMP算法C#/c++实现

本文提供了一段使用C#编写的KMP(Knuth-Morris-Pratt)算法代码,用于字符串匹配。代码中包含了设置失效函数值的方法`SetNext`以及KMP算法的主要实现`KMP`,可以找出输入串在目标串中的起始位置。

直接上代码:

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace dotnetKMP

{

    class Program

    {

        public static int[] strNext;//失效函数值

        static void Main(string[] args)

        {

            const string strForTest = "abaabcac";

            const string strForAim = "abaabcac";

            SetNext(strForTest);

           int i =  KMP(strForAim, strForTest);

            Console.Read();

        }

        /// <summary>

        /// 对输入串进行失效匹配初始化

        /// </summary>

        public static void SetNext( string  inputStr)

            {

                int strLen = inputStr.Length; 

                strNext = new int[strLen];

                int i = 0, j = -1;

                strNext[0] = -1;

                while(i<strLen)

                {

                    if (j == -1 || inputStr[i] == inputStr[j])

                    {

                        i++;

                        if (i >= strLen)

                            break;

                        j++;

                        strNext[i] = j;

                     }

                    else

                    {

                        j = strNext[j];

                    }

 

                }

 

            }

        /// <summary>

        /// KMP算法实现 输出输入串在目标串中的起始位置 没有则输出-1

        /// </summary>

        /// <param name="aimStr">目标串</param>

        /// <param name="testStr">输入串</param>

        public static int KMP(string aimStr,string testStr)

        {

            int i = 0, j = 0;

            while(i< aimStr.Length&&j < testStr.Length)

            {

                if(j==-1)

                {

                    i++;

                    j = 0;

                }

                else if(aimStr[i] == testStr[j])

                {

                    i++;

                    j++;

                }

                else

                {

                    j = strNext[j];

                }

            }

            if (j < testStr.Length)

            {

                return -1;

            }

            else

                return i - j;

        }

    }

}

C++版本 
int StrLen(char *inputStr)
{
int len = 0;
if(*inputStr == '/0')
return 0;
else
{
while(*inputStr != '/0')
{
inputStr++;
len++;
}
}
return len;
}
unsigned int str_str(char * src, char *dst)//KMP实现字符串字串查找
{
int sLen,dLen;
sLen = StrLen(src);
dLen = StrLen(dst);
int nextStr[500];
nextStr[0] = -1;
int i=0;
int j=-1;
while(i<dLen)
{
if(j == -1|| dst[i] == dst[j])
{
i++;
if(i>=dLen)
break;
j++;
nextStr[i] = j;
}
else
{
j = nextStr[j];
}
}
i = 0; 
j = 0;
while(i<sLen&&j<dLen)
{
if( j==-1 ||src[i] == dst[j])
{
i++;
j++;
}
else
{
j = nextStr[j];
}
}
if(j < dLen)
return 0;
else
{
return i - j + 1;
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值