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编程中八种常见的文件操作方式
Nov 19 PHP
PHP 中的批处理的实现
Jun 14 PHP
php利用header函数实现文件下载时直接提示保存
Nov 12 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
php stream_get_meta_data返回值
Sep 29 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
php 过滤危险html代码
2009/06/29 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
js防止表单重复提交实现代码
2012/09/05 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
Vue组件开发初探
2017/02/14 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
如何测量vue应用运行时的性能
2019/06/21 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
在Django的视图(View)外使用Session的方法
2015/07/23 Python
学习python类方法与对象方法
2016/03/15 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
入党思想汇报怎么写
2014/04/03 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
双方协议书
2014/04/22 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
个人职业及收入证明
2014/10/13 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书