KMP算法C#实现

来源:互联网 发布:anything软件 编辑:程序博客网 时间:2024/04/29 12:11
next函数 求出模式串 向右滑动位数
将模式串的str的next函数值 存入 数组next
static void GetNextVal(string str, int [] next)
        {
            int i = 0;
            int j = -1;
            next[0] = -1;
            while (i < str.Length - 1)
            {
                if (j == -1 || str[i] == str[j])
                {
                    i++;
                    j++;
                    next[i] = j;
                }
                else
                {
                    j = next[j];
                }
            }
}
KMP算法
        static int KMP(string zstr, string mstr)
        {
            int i, j;
            int[] next = new int[mstr.Length];
            GetNextVal(mstr, next);
            i = 0;
            j = 0;
            while (i < zstr.Length && j < mstr.Length)
            {
                if (j == -1 || zstr[i] == mstr[j])
                {
                    ++i;
                    ++j;
                }
                else
                {
                    j = next[j];
                }
            }
            if (j == mstr.Length)
                return i - mstr.Length;
            return -1;
        }
 


        static void Main(string[] args)
        {
            string zstr, mstr;
            zstr = Console.ReadLine();
            mstr = Console.ReadLine();
            int pos1;
            pos1 = KMP(zstr, mstr);
            if (pos1 == -1) Console.WriteLine("没有匹配的字符串!");
            else Console.WriteLine(pos1);
            Console.Write("请按任意键继续。。");
            Console.ReadKey(true);
        }
    }
0 0