BMH子串查找算法(PHP实现)

代码
interface  StringSearchable
{
    
public   function  search( $substring ,   $buffer );
}
class  BoyerMooreStringSearch  implements  StringSearchable
{
    
public   $substring   =   null ;
    
public   $buffer   =   '' ;
    
public   $jumpTable   =   array ();
    
protected   $results   =   array ();

    
public   function  __construct()
    {    
        
    }
    
public   function  __destruct()
    {
    }
    
public   function  search( $substring ,   $buffer )
    {    
        
$this -> results  =   array ();
        
$this -> substring  =   $substring ;
        
$this -> buffer  =   $buffer ;
        
$this -> deriveJumpTable();
        
        
$substringLen   =   strlen ( $this -> substring);
        
$currentCharIndex   =   $substringLen   -   1 ;
        
$bufferLen   =   strlen ( $this -> buffer);
        
while  ( $currentCharIndex   <   $bufferLen ) {    
            
for  ( $i   =   $substringLen   -   1 $i   >=   0 $i -- ) {
                
if  ( $this -> buffer[ $currentCharIndex   -   $substringLen   +   $i   +   1 ==   $this -> substring[ $i ]) {
                    
if  ( $i   ==   0 ) {
                        
$this -> results[]  =   $currentCharIndex   -   $substringLen ;
                        
$currentCharIndex   +=   $this -> getJumpLength( $this -> buffer[ $currentCharIndex ]);
                    } 
else  {
                        
continue ;
                    }
                } 
else  {
                    
$currentCharIndex   +=   $this -> getJumpLength( $this -> buffer[ $currentCharIndex ]);
                    
break ;
                }

            }
        }
        
return  ( sizeof ( $this -> results)  >   0 );
    }
    
    
protected   function  deriveJumpTable()
    {
        
$maxJump   =   strlen ( $this -> substring);
        
for  ( $i   =   strlen ( $this -> substring)  -   2 $i   >=   0 $i -- ) {
            
if  ( ! array_key_exists ( $this -> substring[ $i ] ,   $this -> jumpTable)) {
                
$this -> jumpTable[ $this -> substring[ $i ]]]  =   $maxJump   -   $i   - 1 ;
            }
        }
    }
    
public   function  getJumpTable()
    {
        
return   $this -> jumpTable;    
    }
    
public   function  getResults()
    {
        
return   $this -> results;
    }
    
public   function  getResultsCount()
    {
        
return   sizeof ( $this -> results);
    }
    
public   function  getJumpLength( $charIndex )
    {
        
if  ( array_key_exists ( $charIndex ,   $this -> jumpTable)) {
            
return   $this -> jumpTable[ $charIndex ];
        } 
else  {
            
return   strlen ( $this -> substring);
        }
    }
}

function  Main()
{    
    
$poem   =   <<< POEM
    you son of bitch
    god damn it
    hey
, god love me
    POEM;
    
$bm   =   new  BoyerMooreStringSearch();
    
$bm -> search( ' god ' ,   $poem );
    
$count   =   $bm -> getResultsCount;
    
echo   $count ;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值