当前位置: 首页 > news >正文

网站建立方案天津建设工程信息网公布

网站建立方案,天津建设工程信息网公布,广告平台有哪些,设计网页页面的软件模式匹配 什么是模式匹配#xff0c;我们用一个案例来说明#xff1a; 当S “s1,s2,s3,s4 …sn” T“t1,t2,t3,t4 … tn” 在字符串S中寻找T字符串的过程就是模式匹配的过程#xff0c;T就说模式串#xff0c;S是主串 实现方案#xff1a; 暴力破解#xff0c;逐字符判…模式匹配 什么是模式匹配我们用一个案例来说明 当S “s1,s2,s3,s4 …sn” T“t1,t2,t3,t4 … tn” 在字符串S中寻找T字符串的过程就是模式匹配的过程T就说模式串S是主串 实现方案 暴力破解逐字符判断直到找到对应的全匹配由暴力破解的缺点逐步优化引出KMP算法 暴力匹配 思路如下 令i 是目标串S的下标 j是模式串T的下标当匹配到Si Tj 的时候我们做 ij继续匹配下一个当匹配到Si ! Tj 的时候我们需要冲头匹配另 i i - j 1 j 0其中 i i - j 1 就说目标串S的回朔我们匹配过j 个字符那么回退 j个位置到当前这次匹配的最开始的位置并且先前移动一位。 根据如上分析有如下代码 /*** Created by jiamin5 on 2022/2/12.* 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串出现的第一个位置下标从 0 开始。如果不存在则返回 -1 。* 来源力扣LeetCode第28题* 链接https://leetcode-cn.com/problems/implement-strstr*/ public class StrKmp {public static void main(String[] args) {System.out.println(strBM(asdfuohadsuoufhuuowyqruoqiwhgbyur23iu4y2oi34hf, uoq));}/*** 模式匹配BM暴力破解写法* */public static int strBM(String haystack, String needle){if (needle null haystack null) {return 0;}if (haystack null || haystack.length() 0) {return -1;}if (needle.isEmpty()) {return 0;}if (haystack.length() needle.length()) {return -1;}char[] hasChar haystack.toCharArray();char[] needChar needle.toCharArray();int i 0, j 0;while (ihasChar.length j needChar.length){if(hasChar[i] needChar[j]){i;j;}else {ii-j1;j0;}}if(j needChar.length){return i-j;}return -1;} }暴力破解算法分析 我们用一个特殊一点的案例来解释暴力破解算法依然用i 表示目标串Sab abc abcac bab 用j 表示模式串Tabcac 有如下流程第一步当Si Tj 匹配到2 位置的时候匹配是吧i回朔到位置 2-2 1 1j0 第二次匹配第一个字符就失败j1-012 第三次匹配一直匹配到i 6 的时候才匹配失败这个时候i6-41 3从第二个b开始匹配 第四次从第二个b开始显然是不可匹配到 依次一直持续到第六次匹配才匹配成功 总结 在如上流程中每次匹配失败我们都回将i 回朔到当前匹配批次的下一个位置j又从0开始比较在第三次匹配结束后我们可以发现i3和j0i4和j0以及i5和j0是不必进行的关键点在于我们在第三次匹配的时候已经知道了前面的串中有ab abcab从中我们可以得出主串中第345个字符必然是‘b’‘c’‘a’与模式串T中的 123 字符是相同的是可以没必要在匹配的可以在第三步骤的时候就知道我们应该直接移动到i 6 的位置因为i 6 的位置与j 0 的位置都是 a 是想匹配的之前的匹配过的字符已经是已知不可匹配的依照如上分析如果有一个类似的数组用来辅助挑转位置那么明显会加快进程。这样就引出了我们的KMP算法不回溯i加快匹配效率。 KMP算法 KMP算法是一种改进的字符串匹配算法由D.E.KnuthJ.H.Morris和V.R.Pratt提出的因此人们称它为克努特—莫里斯—普拉特操作简称KMP算法。KMP算法的核心是利用匹配失败后的信息尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(mn) [1] 自百度百科 算法流程如下 如果j -1 ij继续匹配下一个字符如果Si Tji j继续匹配下一个字符如果Si ! Tj且j ! -1i不变j next[j]意味着在匹配失败的时候接下来模式串T要相对于主串S向右移 j - next[j] 位置。 那么会出现如下几个问题 next是什么怎么得到next 位移信息next的确认 要了解next的来源先得知道一个名字最长公共前后缀。假设有一个串P“P0P1P2P3…Pj-1Pj”如果存在P0P1P2…Pk-1Pk Pj-kPj-k1…Pj-1Pj我们就可以说在P串中最大长度为k1 的公共前后缀找最大公共前后缀的意义 例如在意思的案例中ab abcabcac bac我们在第三步骤中匹配到第一个abc到第六步骤中匹配到第二个abc在中间四五步骤都在确认该字符abcab其中他的最长公共前后缀长度是也就是ab我们完全可以看出单我们匹配到第一个abc的时候完全可以直接跳过接下来的bc的匹配直接跳到第二个ab去匹配那么最长公共前后缀就是这个作用他告诉我们在已经匹配过的字符串中有没有这样的字符我们直接跳过中间的字符区匹配后面对于的字符ab就行了 前后缀确认 还是用刚才那个案例字符串P abaabca 这样公共先后在最长长度会和P的每个字符有一个对应关系 我们从这个表引出next数组的值next数组的值是除当前字符外的公共前后缀的长度相当于将上表中数据向右移动一位并且在前补充-1得到如下 接下来我们通过next数组来进行匹配推到如下图流程 第一步i 0 j0开始当i 2 j 2 时候匹配失败那么i不动next[j]next[2]0,S右移j - next[j] 2位 , j 回朔到 0 第二次匹配i 2开始j0 当匹配到i 6 j4 时候失败还是一样 i不动 j next[j]next[4] 1,也就是S向右移 j-next[j]3位 第三次匹配i 6 j 1 档i 10 j 5 时候匹配成功返回 i-j5 结论 当主串S 与模式串P 匹配失败时候j next[j],也就是P 右移动j-next[j]。当模式串P后缀Pj-kPj-k1…Pj-1与 主串S的Si-kSi-k1…Si-1匹配成功但是PjSj j匹配失败时候因为next[j] k相当于在不包含Pj的模式串中有最大长度为k的相同前后缀也就是P0P1…Pk-1 Pj-kPj-k1…Pj-1所以我们令j next[j],让模式串 右移 j - next[j]位使模式串 P0P1…Pk-1与主串。Si-kSi-k1…Si-1对齐让Pk 与Si 继续匹配如下图所示 代码实现求next数组 之前我们是通过推到的方式得到的next数组当我们用代码实现时候需要有一定的规则 当next[0] -1,next[1] 0这个容易得到 那么当通用情况当j 1 时候如果我们已知next[j], 那么next[j1]的值是我们需要求解的 有如下两种情况 当Pk Pjnext[j1] next[j] 1 k 1,代表字符E 前面的模式串中有长度为k1 的最长公共前后缀 当Pk ! Pj时候说明p0p1…pk-1pk ! pj-kpj-k1…pj-1pj这个时候ABC与ABD不相同也就是E前面的模式串中没有长度为k1的最大公共前后缀所以next[j1] next[j] 1 不在适用我们需要寻找更短的最大公共前缀。 因为next数组存储的是之前字符中最长公共前后缀那么当我们pk ! pj 的时候我们需要找k之前的一个匹配那么就说next[k] 的位置就是上图中的D我们需要匹配的是 Pnext[k] Pj 是否成立也就让k next[k] 然后在做比较。如果成立那么next[j1] next[next[k]] 1如果不成了next[j1] 0 如上步骤中我们找k 之前的位置next[k]处的前缀来判断是否有更短前缀那为什么我们将k next[k]就能找到最短前后缀如下图中所示 如上图在Pk!Pj时候k next[k] 用 Pnext[k] 去根Pj 匹配我们可以看到Pj之前有一段长度为k的已匹配串在Pk之前也有一段蓝色的已匹配串说明Pk字符前有一段长度为next[k] 的最大公共前后缀蓝色标记如果Pk ! Pj说明P0P1…Pk-1Pk ! Pj-kPj-k1…Pj-1Pj,那么我们需要向前着更短的最大公共前后缀因为此时Pk和Pnext[k] 前面的蓝色串已经完成了匹配如果Pnext[k]能和Pj匹配那么我们就找到了最大公共前后缀否则我们需要再次向前找 Pnext[next[k]] 去根Pj继续匹配直到找到更短的最大公共前后缀或者字符串已经找到最开始位置那么长度就是 0 代码实现 经过如上分析有如下代码 /*** Created by jiamin5 on 2022/2/12.* 给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串出现的第一个位置下标从 0 开始。如果不存在则返回 -1 。* 来源力扣LeetCode第28题* 链接https://leetcode-cn.com/problems/implement-strstr*/ public class StrKmp {public static void main(String[] args) {System.out.println(strKmp(asdfuohadsuoufhuuowyqruoqiwhgbyur23iu4y2oi34hf, uoq));}/*** KMP算法是一种改进的字符串匹配算法由D.E.KnuthJ.H.Morris和V.R.Pratt提出的因此人们称它为克努特—莫里斯—普拉特操作简称KMP算法。* KMP算法的核心是利用匹配失败后的信息尽量减少模式串与主串的匹配次数以达到快速匹配的目的。* 具体实现就是通过一个next()函数实现函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(mn)。** */public static int strKmp(String haystack, String needle){if (needle null haystack null) {return 0;}if (haystack null || haystack.length() 0) {return -1;}if (needle.isEmpty()) {return 0;}if (haystack.length() needle.length()) {return -1;}char[] hasChar haystack.toCharArray();char[] needChar needle.toCharArray();int [] next getNext(needChar);int i 0, j 0;while (ihasChar.length j needChar.length){if(j -1 || hasChar[i] needChar[j]){i;j;}else {jnext[j];}}if(j needChar.length){return i-j;}return -1;}public static int[] getNext(char[] needChar){int[] next new int[needChar.length1];int j 0, k -1;next[j] k;while (j needChar.length){if(k -1 || needChar[j] needChar[k]){j;k;next[j] k;}else {k next[k];}}return next;} }参考文献 大佬v_JULY_v 的文章比我更详细 前期文章 上一篇数据结构与算法–求1~n能组成的所有二叉搜索树的排列下一篇数据结构与算法–力扣108提将有序数组转换为二叉搜索树
http://www.sadfv.cn/news/49259/

相关文章:

  • 韩国风网站信息管理网站开发实验报告
  • 佛山建设局官方网站选择做网站销售的优势
  • 做外贸哪个网站比较好2017今天热点新闻事件
  • 建设企业网站官网下载wordpress修改主题页面
  • 兰州做网站客户河南省建设厅建筑业信息网
  • 支付行业的网站怎么做注册电子邮箱号
  • 个人备案网站做盈利合法吗wordpress标签404
  • 长安网站建设制作公司西宁网站制作哪家好
  • 漯河商城网站建设无为县住房和城乡建设局网站首页
  • 山东省建设厅官方网站怎么样godaddy wordpress托管
  • 国内外网站开发现状搜索推广专员
  • 网站开发用台式机电脑配置纯html静态网站
  • 做网站需要哪些框架做号网站吗
  • 百度做网站需要多少钱盐城亭湖区建设局网站
  • 网站的大图标怎么做Wordpress 图片之间空隙
  • 网站建设公司怎么盈利做ppt模板的网站有哪些
  • 如何搭建一个视频网站网站建设与管理课程设计
  • 营销型网站网站网站建设虚拟主机
  • 广州企业网站哪家好小程序推广怎么赚钱
  • 关于网站建设的入门书wordpress 黑色
  • 网页设计门户网站英文网站的外部链接 建设
  • 网站后台修改图片网络公司网站制作岗位职责
  • 深圳网站开发公司哪家好成都搜索引擎优化推广维护
  • 快速排名优化已有的网站如何做排名优化
  • 百度网站好评贵州省建设厅造价通官方网站
  • 如何向搜索引擎提交网站网站 推广商系统 设计
  • 门户网站开发如何提高产品排名佛山网站免费制作
  • 写着网站建设图片网站做联盟还赚钱吗
  • 专题类响应式网站建设怎么样建设自己网站
  • 公司做网站的费属于广告费么国内做网站大公司