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;
}
复制代码



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2010/04/21/1717668.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
算法 PHP 数据中心
基于php雪花算法工具类Snowflake -来自chatGPT
基于php雪花算法工具类Snowflake -来自chatGPT
121 2
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
249 0
|
算法 PHP 数据库
如何使用PHP编写一个人脸识别算法?底层原理是什么?
如何使用PHP编写一个人脸识别算法?底层原理是什么?
238 0
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
268 0
|
PHP
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
524 0
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
|
网络协议 Linux 网络安全
php实现websocket实时消息推送
php实现websocket实时消息推送
549 0
php实现websocket实时消息推送
|
PHP
php实现数字格式化,数字每三位加逗号的功能函数169856420=&gt;169,856,420
php实现数字格式化,数字每三位加逗号的功能函数169856420=&gt;169,856,420
221 0
|
PHP
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
438 0
|
消息中间件 PHP Windows
PHP实现php-amqplib/php-amqplib实例RabbitMq
PHP实现php-amqplib/php-amqplib实例RabbitMq
302 0
|
XML 移动开发 JSON
PHP使用yansongda/pay实现支付宝和微信的支付
PHP使用yansongda/pay实现支付宝和微信的支付
1099 0