KMP算法C#/c++实现

来源:互联网 发布:难言之欲网络剧百度云 编辑:程序博客网 时间:2024/04/28 21:24

直接上代码:

 

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;

        }

    }

}

详解请看http://www.cnblogs.com/campfeather/articles/536313.html
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;
}
}