PHP实现的字符串匹配算法示例【sunday算法】


Posted in PHP onDecember 19, 2017

本文实例讲述了PHP实现的字符串匹配算法————sunday算法。分享给大家供大家参考,具体如下:

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

<?php
/*
 *@param $pattern 模式串
 *@param $text 待匹配串
 */
function mySunday($pattern = '',$text = ''){
  if(!$pattern || !$text) return false;
  $pattern_len = mb_strlen($pattern);
  $text_len = mb_strlen($text);
  if($pattern_len >= $text_len) return false;
  $i = 0;
  for($i = 0; $i < $pattern_len; $i++){ //组装以pattern中的字符为下标的数组
    $shift[$pattern[$i]] = $pattern_len - $i;
  }
  while($i <= $text_len - $pattern_len){
    $nums = 0;   //匹配上的字符个数
    while($pattern[$nums] == $text[$i + $nums]){
      $nums++;
      if($nums == $pattern_len){
        return "The first match index is $i\n";
      }
    }
    if($i + $pattern_len < $text_len && isset($shift[$text[$i + $pattern_len]])){ //判断模式串后一位字符是否在模式串中
      $i += $shift[$text[$i + $pattern_len]];   //对齐该字符
    }else{
      $i += $pattern_len;   //直接滑动pattern_len位
    }
  }
}
$text = "I am testing mySunday on sunday!";
$pattern = "sunday";
echo mySunday($pattern,$text);

运行结果:

The first match index is 25

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP和MySQL保存和输出图片
Oct 09 PHP
php基础知识:类与对象(1)
Dec 13 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
PHP中的float类型使用说明
Jul 27 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
Thinkphp中的volist标签用法简介
Jun 18 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 PHP
PHP实现的折半查找算法示例
Dec 19 #PHP
PHP实现的二分查找算法实例分析
Dec 19 #PHP
PHP实现git部署的方法教程
Dec 19 #PHP
PHP递归实现快速排序的方法示例
Dec 18 #PHP
Laravel框架中自定义模板指令总结
Dec 17 #PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 #PHP
PHP7下协程的实现方法详解
Dec 17 #PHP
You might like
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Python 如何对文件目录操作
2020/07/10 Python
Python无损压缩图片的示例代码
2020/08/06 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
如何用python批量调整视频声音
2020/12/22 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
军训自我鉴定
2013/12/14 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
技术员个人工作总结
2015/03/03 职场文书