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中集成PayPal标准支付的实现方法分享
Feb 06 PHP
redis 队列操作的例子(php)
Apr 12 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
php生成curl命令行的方法
Dec 14 PHP
Thinkphp连表查询及数据导出方法示例
Oct 15 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
Oct 21 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
js 控制下拉菜单刷新的方法
2013/03/03 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
js实现上下左右弹框划出效果
2017/03/08 Javascript
js正则相关知识点专题
2018/05/10 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
[01:32]DOTA2上海特锦赛现场采访:最想COS的英雄
2016/03/25 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Django页面数据的缓存与使用的具体方法
2019/04/23 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
详解python 内存优化
2020/08/17 Python
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
实用求职信范文分享
2013/12/25 职场文书
保险公司开门红口号
2014/06/21 职场文书
单位租房协议书范本
2014/12/04 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js