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随机生成随机个数的字母组合示例
Jan 14 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
php实现读取内存顺序号
Mar 29 PHP
php无序树实现方法
Jul 28 PHP
php实现微信公众号无限群发
Oct 11 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
Sep 11 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PHP 验证身份证是否合法的函数
Feb 09 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
瀑布流的实现方式(原生js+jquery+css3)
2020/06/28 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
python实现滑雪游戏
2020/02/22 Python
python request 模块详细介绍
2020/11/10 Python
CSS3 简写animation
2012/05/10 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
小学毕业家长寄语
2014/01/19 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
创文明城市标语
2014/06/16 职场文书
学校教师安全责任书
2014/07/23 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android