KMP算法--C#版

        static void BuildTable(string subString, ref int[] next)
        {
            if (string.IsNullOrWhiteSpace(subString)) return;

            int j = 0, k = -1;
            next[0] = -1;
            while (j < subString.Length - 1)
            {
                if (-1 == k || subString[j] == subString[k])
                {
                    j++;
                    k++;
                    next[j] = k;
                }
                else
                {
                    k = next[k];
                }
            }
        }

        /// <summary>
        /// 查找算法
        /// </summary>
        /// <param name="source">要搜索的字符串</param>
        /// <param name="subString">子串</param>
        /// <returns>子串在source字符串中的开始位置</returns>
        static int KmpSearch(string source, string subString)
        {
            if (string.IsNullOrWhiteSpace(source) || string.IsNullOrWhiteSpace(subString))
                return -1;
            var next = new int[subString.Length];
            for (int k = 0; k < next.Length; k++)
            {
                next[k] = -1;
            }
            int i = 0, j = 0,sLen = subString.Length;

            BuildTable(subString, ref next);

            while (i < sLen)
            {
                if (j == -1 || source[i] == subString[j])
                {
                    i++;
                    j++;
                }
                else
                {
                    j = next[j];
                }

                if (j == sLen)
                {
                    return i - sLen;
                }
            }
            return -1;
        }

使用

            string source = "我是中和敏式的服务二是到覅维尔维尔34山东富翁234斯蒂芬234234式的服务二";
            string subString = "山东富翁";

            int a = KmpSearch(source, subString);

            Console.WriteLine(a);

 

posted @ 2013-12-10 14:40  飘渺峰  阅读(1342)  评论(1编辑  收藏  举报