BoyerMoore 算法

主题思想: 写一个用于字符串匹配的BoyerMoore 算法,KMP 算法,我现在不会,但是这个算法,好写,且容易理解。我来徒手写下。

public class BoyerMoore{
    private String pat;
    private int[] right;
    public 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++)
            right[pat.charAt(j)]=j;
    }
    public int search(String txt){
        int N=txt.length();
        int M=pat.length();
        int skip;
        for(int i=0;i<N-M;i+=skip){
            skip=0;
            for(int j=M-1;j>=0;j--)
                if(txt.charAt(i+j)!=pat.charAt(j)){
                    skip=j-right[txt.charAt(i+j)]
                    if(skip<1) skip=1;
                    break;
                }
            if(skip==0)return i;
        }
        return N;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Boyer-Moore算法是一种用于字符串匹配的高效算法。下面是Boyer-Moore算法的伪代码: ``` function BoyerMoore(text, pattern): n = length of text m = length of pattern if m > n: return -1 // 初始化坏字符表 badCharTable = createBadCharTable(pattern) // 初始化好后缀表 goodSuffixTable = createGoodSuffixTable(pattern) // 开始匹配 i = m - 1 while i < n: j = m - 1 while j >= 0 and text[i] == pattern[j]: i = i - 1 j = j - 1 if j == -1: return i + 1 else: // 计算坏字符位移 badCharShift = calculateBadCharShift(j, text[i], badCharTable) // 计算好后缀位移 goodSuffixShift = calculateGoodSuffixShift(j, pattern, goodSuffixTable) // 取较大的位移 shift = max(badCharShift, goodSuffixShift) i = i + shift return -1 function createBadCharTable(pattern): table = empty table m = length of pattern for i = 0 to m - 2: table[pattern[i]] = m - 1 - i return table function createGoodSuffixTable(pattern): table = empty table m = length of pattern suffixes = findSuffixes(pattern) for i = 0 to m - 1: table[i] = m for i = m - 1 to 0: if suffixes[i] == i + 1: for j = 0 to m - 1 - i: if table[j] == m: table[j] = m - 1 - i for i = 0 to m - 2: table[m - 1 - suffixes[i]] = m - 1 - i return table function findSuffixes(pattern): m = length of pattern suffixes = empty array suffixes[m - 1] = m g = m - 1 for i = m - 2 to 0: if i > g and suffixes[i + m - 1 - f] < i - g: suffixes[i] = suffixes[i + m - 1 - f] else: if i < g: g = i f = i while g >= 0 and pattern[g] == pattern[g + m - 1 - f]: g = g - 1 suffixes[i] = f - g return suffixes function calculateBadCharShift(j, char, badCharTable): if char in badCharTable: return j - badCharTable[char] else: return j + 1 function calculateGoodSuffixShift(j, pattern, goodSuffixTable): m = length of pattern k = m - 1 - j if goodSuffixTable[k] != m: return m - 1 - goodSuffixTable[k] else: for r = j + 2 to m - 1: if isPrefix(pattern, r): return m - r return m function isPrefix(pattern, p): m = length of pattern k = 0 for i = p to m - 1: if pattern[i] != pattern[k]: return False k = k + 1 return True ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值