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="确认" onclick="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>

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。