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

网站全部用根目录中国建筑人才网怎么样

网站全部用根目录,中国建筑人才网怎么样,wordpress站点一百数据卡不,北京一诺网站建设公司文章目录 一 、前言二、 暴力解法三、KMP算法原理3.1 自动子串的指针3.2 跳过多少个字符3.3 next数组 - 暴力3.4 next数组 - 求解 四 KMP实现 一 、前言 字符串匹配 import re print(re.search(www, www.runoob.com).span()) # 在起始位置匹配 print(re.search(com, www.run…

文章目录

  • 一 、前言
  • 二、 暴力解法
  • 三、KMP算法原理
    • 3.1 自动子串的指针
    • 3.2 跳过多少个字符
    • 3.3 next数组 - 暴力
    • 3.4 next数组 - 求解
  • 四 KMP实现

一 、前言

字符串匹配

import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配

SQL中的匹配

SELECT * FROM Persons
WHERE City LIKE '%lon%'

我们注意到这些都是需要用到字符串匹配的,我们再深入想一下,这些字符串是怎么匹配的呢?

二、 暴力解法

public class baoli {public static void main(String[] args) {String text = "ABABDABACDABABCABAB";//19String pattern = "ABABCABAB";//9int index = bruteForceMatch(text, pattern);if (index == -1) {System.out.println("Pattern not found in the text");} else {System.out.println("Pattern found at index " + index);}}public static int bruteForceMatch(String text, String pattern){int n = text.length();int m = pattern.length();for (int i = 0; i <= n - m; i++) {int j;for (j = 0; j < m; j++) {if (text.charAt(i + j) != pattern.charAt(j)) {break;}}if (j == m) {return i; // 匹配成功,返回起始位置}}return -1; // 匹配失败}
}

看到这种brute force暴力解法的时间复杂度为O(mn)

一个字一个字的匹配,一旦出错就匹配下一个

在这里插入图片描述
但是这样带来了巨大的浪费

三、KMP算法原理

在这里插入图片描述

KMP算法是用的这三位大佬的名字首字母,没有什么特殊含义

3.1 自动子串的指针

在这里插入图片描述
匹配失败,已经知道了前面读过了哪些char,所以移动子串的指针

在这里插入图片描述

3.2 跳过多少个字符

在这里插入图片描述

KMP算法会定义一个next数组,记录对应 可以跳过字符的个数

    public static int kmpSearch(String text, String pattern) {int[] next = computeLPSArray(pattern);int i = 0; // text的指针int j = 0; // pattern的指针while (i < text.length()) {if (text.charAt(i) == pattern.charAt(j)) { // char匹配,都后移i++;j++;if (j == pattern.length()) {return i - j; // string匹配成功,返回起始位置}} else {if (j != 0) { // char匹配失败,pattern回退到上一个匹配的位置j = next[j - 1];} else { // 字符串第一个就匹配失败,直接后移i++;}}}return -1; // 匹配失败}

3.3 next数组 - 暴力

在这里插入图片描述

next数组:寻找子串中“相同前后缀的最长长度,不能是字符串本身”

那么如何获取这个next数组呢,当然首先可以想到for循环暴力求解

    public static int[] bruteComputeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0;for (int i = 1; i <= pattern.length() - 1; i++) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;} else {if (len != 0) {len = lps[len - 1];i--;} else {lps[i] = 0;}}}return lps;}

3.4 next数组 - 求解

在这里插入图片描述

下一步相同,那么直接就是2+1
下一步不同呢?

在这里插入图片描述

左边这部分前后缀 = 右边这部分前后缀

直接在左边进行查找即可

在这里插入图片描述
于是又开始,寻找下一个char是否相同

    public static int[] computeLPSArray(String pattern) {int[] next = new int[pattern.length()];int len = 0; // 最长公共前后缀的长度int i = 1; // pattern的指针while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;next[i] = len;i++;} else {if (len != 0) {len = next[len - 1]; // 回退到前一个匹配的位置} else {next[i] = 0;i++;}}}return next;}

四 KMP实现

package com.KMP;public class KMPAlgorithm {public static void main(String[] args) {String text = "ABABDABACDABABCABAB";String pattern = "ABABCABAB";int index = kmpSearch(text, pattern);if (index == -1) {System.out.println("Pattern not found in the text");} else {System.out.println("Pattern found at index " + index);}}public static int kmpSearch(String text, String pattern) {int[] next = computeLPSArray(pattern);int i = 0; // text的指针int j = 0; // pattern的指针while (i < text.length()) {if (text.charAt(i) == pattern.charAt(j)) { // char匹配,都后移i++;j++;if (j == pattern.length()) {return i - j; // string匹配成功,返回起始位置}} else {if (j != 0) { // char匹配失败,pattern回退到上一个匹配的位置j = next[j - 1];} else { // (j == 0) 字符串第一个就匹配失败,直接后移i++;}}}return -1; // 匹配失败}public static int[] computeLPSArray(String pattern) {int[] next = new int[pattern.length()];int len = 0; // 最长公共前后缀的长度int i = 1; // pattern的指针while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;next[i] = len;i++;} else {if (len != 0) {len = next[len - 1]; // 回退到前一个匹配的位置} else {next[i] = 0;i++;}}}return next;}public static int[] bruteComputeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0;for (int i = 1; i <= pattern.length() - 1; i++) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;} else {if (len != 0) {len = lps[len - 1];i--;} else {lps[i] = 0;}}}return lps;}
}
http://www.yayakq.cn/news/156220/

相关文章:

  • 浙江网站建设价格做神秘顾客哪个网站好
  • 营销品牌网站建设wordpress 微博登陆
  • 个人网站可以做网上支付吗PHP网站建设计划书
  • 做网站系统的销售怎么做硬件开发是做什么工作
  • 红河州网站建设制作苏州网站的建设
  • 网站服务器租用哪家好网站建设合作分成合同
  • 建设网站要备案吗襄阳官网建站公司
  • 食品网站建设优化案例wordpress 站点更改
  • 凡科网站插件代码上海网站平台建设
  • 哪家企业网站建设好昆明网站快速优化排名
  • 初学网站开发书籍替网站做任务怎么做的
  • 成都哪家做网站比较好软文推广范文
  • 网站开发公司人员配置如何做网页游戏网站
  • 松原市网站建设linux下装wordpress
  • 网站建设安全协议我想在阿里巴巴上给别人做网站
  • 常州模板建站代理免费logo在线制作字体logo
  • 哈尔滨网站建设开发外包开发公司名称起名大全
  • 无为县城乡建设局网站首页p图软件哪个好用
  • flash里面如何做网站链接20g虚拟主机建设网站
  • 制作网站建设的公司vps用什么软件做网站
  • 设计软件推荐乐陵关键词seo
  • 做网站用哪个笔记本织梦如何将wordpress
  • 泉州住房城乡建设局网站淘宝运营公司
  • 餐饮网站建设方案深圳市建筑工程股份有限公司
  • 浏阳做网站推荐商业门户网站怎么运营
  • 网站开发创业计划书财务分析郑州营销型网站建设价格
  • 毕业设计做网站做不出网站备案信息如何注销
  • 建网站需要哪些语言网站备案 管局审核 需要多长时间
  • 一个网站seo做哪些工作内容如何做收费网站
  • 网站域名和空间做的网站如何发布