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制作图型计数器的例子
Oct 09 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP处理excel cvs表格的方法实例介绍
May 13 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 PHP
php单例模式的简单实现方法
Jun 10 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
PHP dirname功能及原理实例解析
Oct 28 PHP
PHP实现的折半查找算法示例
Dec 19 #PHP
php之header的不同用法总结(实例讲解)
Nov 28 #PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 #PHP
PHP命令空间namespace及use的用法小结
Nov 27 #PHP
Laravel 批量更新多条数据的示例
Nov 27 #PHP
PHP开发实现微信退款功能示例
Nov 25 #PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 #PHP
You might like
php引用返回与取消引用的详解
2013/06/08 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
PDO::quote讲解
2019/01/29 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python pdb调试方法分享
2014/01/21 Python
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
理论讲解python多进程并发编程
2018/02/09 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Django配置文件代码说明
2019/12/04 Python
pytorch 求网络模型参数实例
2019/12/30 Python
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
Java面试题及答案
2012/09/08 面试题
我的动漫时代的创业计划书范文
2014/01/27 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
教师节标语大全
2014/10/07 职场文书
统计工作个人总结
2015/03/03 职场文书
教师岗位职责范本
2015/04/02 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
用python画城市轮播地图
2021/05/28 Python
解析python中的jsonpath 提取器
2022/01/18 Python