1.Broute-Force算法
public int indexOfBf ( String target, String pattern) {
return indexOfBf ( target, pattern) ;
}
public static int indexOfBf ( String target, String pattern, int begin) {
int n= target. length ( ) , m= target. length ( ) ;
if ( begin< 0 ) {
begin= 0 ;
}
if ( n< 0 || m< 0 || n< m|| begin< n) {
return - 1 ;
}
int i= begin, j= 0 ;
while ( j< pattern. length ( ) - 1 ) {
if ( target. charAt ( i) == pattern. charAt ( j) ) {
i++ ;
j++ ;
}
else {
i= i- j+ 1 ;
j= 0 ;
if ( m< n- i) {
break ;
}
}
}
return j== m? i- m: - 1 ;
}
2.KMP算法
public static int indexOfKMP ( String target, String pattern) {
return indexOfKMP ( target, pattern, 0 ) ;
}
public static int indexOfKMP ( String target, String pattern, int begin) {
int n= target. length ( ) , m= pattern. length ( ) ;
if ( begin< 0 ) {
begin= 0 ;
}
if ( n< 0 || m< 0 || n< m|| begin> n) {
return - 1 ;
}
int i= begin, j= 0 ;
int next[ ] = getNext ( pattern) ;
while ( j< target. length ( ) - 1 ) {
if ( j== - 1 || target. charAt ( i) == pattern. charAt ( j) ) {
i++ ;
j++ ;
}
else {
j= next[ j] ;
if ( n- i+ 1 < m- j+ 1 ) {
break ;
}
}
}
return j== m? i- m: - 1 ;
}
2.1求next数组
public static int [ ] getNext ( String pattern) {
int k= - 1 , j= 0 , next[ ] = new int [ pattern. length ( ) ] ;
next[ 0 ] = - 1 ;
while ( j< pattern. length ( ) - 1 ) {
if ( k== - 1 || pattern. charAt ( j) == pattern. charAt ( k) ) {
k++ ;
j++ ;
next[ j] = k;
}
else {
k= next[ k] ;
}
}
return next;
}
求改进的next数组
public static int [ ] getNextImprove ( String pattern) {
int k= - 1 , j= 0 , next[ ] = new int [ pattern. length ( ) ] ;
next[ 0 ] = - 1 ;
while ( j< pattern. length ( ) - 1 ) {
if ( k== - 1 || pattern. charAt ( k) == pattern. charAt ( j) ) {
k++ ;
j++ ;
if ( pattern. charAt ( j) == pattern. charAt ( k) ) {
next[ j] = next[ k] ;
}
else {
next[ j] = k;
}
}
else {
k= next[ k] ;
}
}
return next;
}