package com.interview.algorithms.string;
/**
* Created_By: stefanie
* Date: 14-7-20
* Time: 下午2:45
*/
public class C11_20_SubStringLocator {
public static int match(String a, String b){
for(int i = 0; i < a.length(); i++) {
int j = 0;
for (; j < b.length() && b.charAt(j) == a.charAt(i + j); j++);
if (j >= b.length()) return i;
}
return -1;
}
public static int kmpMatch(String a, String b){
int[] next = calNext(b);
int i = 0, j = 0;
while(i < a.length() && j < b.length()){
if(b.charAt(j) == a.charAt(i)){
i++;
j++;
} else if(j == 0) {
i++;
} else j = next[j];
if(j == b.length()) return i - j;
}
return -1;
}
private static int[] calNext(String b){
int[] next = new int[b.length()];
int i=0, j=-1;
next[0]=-1;
while(i < next.length - 1){
if(j == -1 || b.charAt(i) == b.charAt(j)){
++i;
++j;
next[i]=j;
}
else j=next[j];
}
return next;
}
public static int sunnyMatch(String a, String b){
int[] D = calD(b);
int i = b.length() - 1, j = 0, k = 0;
while(j >= 0 && i < a.length()){
j = b.length() - 1;
k = i;
while(j >= 0 && a.charAt(k) == b.charAt(j)){
j--;
k--;
}
i+= D[a.charAt(i) - 'a'];
}
if(j < 0) return k + 1;
else return -1;
}
private static int[] calD(String b){
int[] D = new int[26];
int M = b.length();
for(int i = 0; i < 26; i++) D[i] = M;
for(int i = M-2; i >= 0; i--)
if(D[b.charAt(i) - 'a'] == M) D[b.charAt(i) - 'a'] = M - i - 1;
return D;
}
}