BM算法--串匹配

BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快。时间复杂度O(m/n)

C++描述(教师版)

int BM(char S[],char T[], int n, int m)
{
//主串长度为n,模式串长度为m,主串和模式串的数组下标从1开始
      int i=m;
      int j;
      while(i<=n){
            j=m;
            while(j>0&&S[i]==T[j]){
	   j--;
	   i--;
            }
            if(j==0) return i+1;
            else {
	    i=i+dist(S[i],T,m);  
	    cout<<"重新从主串的"<<i<<"处向前匹配"<<endl;
            }
      }
      return 

 我的javascript版实现

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>BM算法</title>
    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript">
        //T:子串,S:主串,SI:主串起始下标,TJ:子串起始下标
        function BM(S, T, SI, TJ) {
            while ( TJ >=0&&SI<S.length) {
                if (S[SI] == T[TJ]) {

                    if (TJ==0) {
//返回开始的位置,自然记数。
                        return SI+1;
                    }

                    SI--;
                    TJ--;

                } else {
                    SI = SI + dist(T, S[SI]);
                    TJ = T.length - 1;
                }
            }
//查找不到时返回-1
             return -1;



        }


        function dist(array, target) {
            for (var i = 0; i < array.length; i++) {
                if (array[i] == target) {
                    if (i == array.length - 1) {
                        return array.length;
                    }

                    return array.length - i -1;
                }


            }


            return array.length;


        }


    </script>
</head>
<body>

<input type="text" id="S" placeholder="要查找的字符串"/><br/>
<input type="text" id="T" placeholder="关键字符串"/><br/>
<input type="button"  value="确认" οnclick="demo();"/>
<script type="text/javascript">
    function demo() {
        var S = $('#S').val();
        var T = $('#T').val();
        alert(BM(S, T, T.length - 1, T.length - 1));

    }
</script>


</body>
</html>

 

 

 

转载于:https://www.cnblogs.com/nova-/p/4384340.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值