Boyer_Moore字符串匹配算法.java

本文介绍了一种高效的字符串搜索算法——Boyer-Moore算法,并提供了详细的实现代码。该算法通过预处理模式串来优化搜索过程,利用坏字符法则进行跳转,极大提升了搜索效率。
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;   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值