[算法]字符串匹配算法KMP(java)

参考http://www.tuicool.com/articles/e2Qbyyf

public class KMP {

    public static void cal_next(String str,int[] next,int len){
        int i, j;

        next[0] = -1;
        for( i = 1; i < len; i++ )
        {
            j = next[ i - 1 ];
            while( str.charAt(j+1) != str.charAt(i)&& ( j >= 0 ) )
            {
                j = next[ j ];
            }
            if( str.charAt(i) == str.charAt(j+1) )
            {
                next[ i ] = j + 1;
            }
            else
            {
                next[ i ] = -1;
            }
        }
    }

    public static int KMP(String str, int slen, String ptr, int plen, int[] next ){
        int s_i = 0, p_i = 0;

        while( s_i < slen && p_i < plen )
        {
            if( str.charAt(s_i) == ptr.charAt(p_i))
            {
                s_i++;
                p_i++;
            }
            else
            {
                if( p_i == 0 )
                {
                    s_i++;
                }
                else
                {
                    p_i = next[ p_i - 1 ] + 1;
                }
            }
        }
        return ( p_i == plen ) ? ( s_i - plen ) : -1;
    }
    public static void main(String[] args) {
        final int n=100;

        String str,ptr;
        int slen, plen;
        int next[]=new int[n];
        Scanner in = new Scanner(System.in);

        while((str=in.nextLine())!=null && (ptr=in.nextLine())!=null){

            slen=str.length();
            plen=ptr.length();
            cal_next(ptr, next, plen);
            System.out.println(KMP(str, slen, ptr, plen, next));
        }


    }

}

猜你喜欢

转载自blog.csdn.net/mjl960108/article/details/54572154
今日推荐