KMP算法笔记

`

public static void KPM_Next(string t, ref int[] next)
        {
            int i=0,//i是 字符串的指针,从 0到 length
                j = -1;// 即用来存储匹配的数量 又来当作回溯指针 
            next[0] = -1;  
            while (i<t.Length ) //length=6
            {
                if (j==-1 ||t[i]==t[j])  //b t[1]==t[0]( X )  t[2]==t[0] (X)  t[3]==t[0] (✔)  t[4]==t[1](✔) t[5]==t[2] (X)     //-1 表示是 不匹配,则把进行到的第i+1位 设置为0  
                { //如果 不为-1  说明  目前 第i位 与第j相等,  则把 i+1位 相等的数量为j+1 记录下来
                  // i :第N次的结果:1  2  3  4 5.....  N
                  //j:第N次的结果 :0  0  0  1 2...   N
                    next[++i] = ++j; //记录 相同 位置{-1,0,0,0,1,2}
                }
                else
                {
                    j = next[j]; //从上次 匹配 相同的地方开始,如果上次匹配不相同则取-1,也就是取next的第一位,    第一次: 取-1 第二次: 取 -1第三次:next[2]取0说明相同了,  
                }                
            }
        }
        /// 
        /// 字符s 是否包含T
        /// 
        /// 匹配的母字符
        /// 匹配的子字符
        /// 起始匹配位置
        /// 
        public static int KPM_Index(string s,string t,int pos=0)
        {
            int i = pos;
            int j = 0;
            int[] next=new int[255];
            KPM_Next(t,ref next);
             while (i <s.Length && j<t.Length) 
            {
                if (j == -1 || s[i]==t[j]) //abcde   cde
                {
                    i++;
                    j++;
                }
                else
                { 
                    j = next[j]; //回溯   i不移动  继续从第i位 进行匹配,j取上次相同的地方,不同取-1,继续与第s[0]位匹配,
                }
            }
              
            if (j>=t.Length)
            {
                return i - t.Length;
            }
            else
            {
                return -1;
            }
        }
 

你可能感兴趣的:(S1_数据结构学习)