【代码向】字符串KMS算法,判断某一字符串是否包含另一字符串

    public static class KMS
    {
        #region Defines
        public const int StringStartIndex = 0;
        #endregion
        private static int[] GetNext(string s)
        {
            int[] next = new int[s.Length];
            //当与首字符不同时继续判断下一个字符是否与首字符相同
            next[StringStartIndex] = StringStartIndex - 1;
            int i = StringStartIndex, j = StringStartIndex - 1;
            while (i < s.Length - 1)
            {
                //前一个或是串内全然不同时重新判断,后一个是串内部分相同时,从相同处尾开始判断
                if (j == StringStartIndex - 1 || s[i] == s[j])
                {
                    //此时可以避免进行重复判断(及相同的字符判断不同时,索引到前一个相同的字符继续判断是否不同
                    if (s[++i] != s[++j])
                        next[i] = j;//此时与之前相同
                    else
                        next[i] = next[j];
                }
                else
                    j = next[j];//之所以不是初始化为StringStartIndex - 1,是为了避免串内相同串内还有相同串
                //例如qwqqaqqwqqqwqqaq,qwqqaq有两处重复,qwq有三处
            }
            return next;
        }

        public static int KMS_Index(string b, string c)
        {
            int[] next = GetNext(c);
            int i = StringStartIndex - 1, j = StringStartIndex - 1;
            while (i < b.Length && j < c.Length)
            {
                //或判断的前半句是当与首字符不同时继续判断下一字符(因为++j之后j是StringStartIndex),或判断的后半句是相同时继续判断下一个字符是否相同
                if (j == StringStartIndex - 1 || b[i] == c[j])
                {
                    ++i;
                    ++j;
                }
                else
                    j = next[j];
            }
            if (j == c.Length)
                return i - c.Length;
            return -1;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值