/**
* @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);
}
BmOptUtils
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...