参考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));
}
}
}