/**
* @param pattern 模式串:要匹配的短语
* @param input 被匹配的短语输入
* **/
private static boolean indexOf(String pattern, String input){
try{
int n = pattern.length();
int m = input.length();
if(m <= 0 || n <= 0){
return false;
}
if(m < n){
return false;
}
//设置起始位置。起始位置为:0~pattern.length - 1
int i = n - 1;
int j = n - 1;
while (i < m && j >= 0){
System.out.println(input.charAt(i) + " --- " + pattern.charAt(j));
if(input.charAt(i) != pattern.charAt(j)){
int bad = getBadCharLen(input.charAt(i), pattern.toCharArray(), j);
//通过当前循环中的索引获取好后缀的长度
int goodSuffix = n - 1 - j + bad;
int len = Math.max(bad, goodSuffix);
if(goodSuffix > bad){
i = i + len + n;
}else {
i += len;
}
j = n - 1;
}else{
--i;
--j;
}
}
if(i >= m){
return false;
}
return true;
}catch (Exception e){
e.printStackTrace();
}
return false;
}
/**
* 如果是坏字符,则需要移动的长度
* 通过判断是否存在好字符位置
* **/
private static int getBadCharLen(char inputChar, char[] patternChars, int i){
try{
int m = i;
for(; m >= 0; --m){
if(inputChar == patternChars[m]){
//验证是否坏串中存在字符相同的,存在则表示移动到对应该位置; 如果"坏字符"不包含在搜索词之中,则上一次出现位置为 -1。
return i - m == 0 ? 1 : i - m;
}
}
//否则表示整个串是坏串,根据公式坏字符位置 - (-1) = len
return i;
}catch (Exception e){
e.printStackTrace();
}
return 0;
}
public static void main(String[] args) {
List<PatternLocation> matchs = indexOf("成海贼王", "我是要成为海贼王的男人还好大");
System.out.println(matchs);
}
网友评论