package string;
public class Boyer_Moore字符串匹配算法 {//启发式地处理不匹配的字符
public static void main(String[] args) {
BoyerMoore bm = new BoyerMoore("abc");
System.out.println(bm.search("aababcdd"));
}
}
class BoyerMoore{
private int[] right;//记录每个字符再pat中出现的最靠右的地方(如果字符在pat中不存在表示-1)
//这个值揭示了若果该字符出现在文本中且在查找是造成了一次匹配失败,应该享有跳跃多远。
private String pat;
BoyerMoore(String pat){
this.pat = pat;
int M = pat.length();
int R = 256;
right = new int[R];
for(int c=0;c<R;c++)
right[c] = -1;
for(int j=0;j<M;j++)//遍历pat中的每一个字符
right[pat.charAt(j)] = j;
}
public int search(String txt){//再txt中查找pat字符串
int N = txt.length();
int M = pat.length();
int skip;
for(int i=0;i<=N-M;i+=skip){//i代表着txt中的pat开头位置
skip = 0;
for(int j=M-1;j>=0;j--){//pat整体向右匹配txt,pat局部的每个字符倒着匹配txt
if(pat.charAt(j) != txt.charAt(i+j)){
skip = j - right[txt.charAt(i+j)];//
if(skip < 1) skip = 1;
break;
}
}
if(skip == 0) return i;//如果没有跳跃,说明成功了
}
return N;
}
}
Boyer_Moore字符串匹配算法.java
最新推荐文章于 2021-02-23 01:56:01 发布
