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

沈阳定制网站开发公司wordpress coolcode

沈阳定制网站开发公司,wordpress coolcode,诸城网站建设,长沙网站 微信建设文章目录 一 、前言二、 暴力解法三、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/619097/

相关文章:

  • 计算机网站建设维护的目的小水库运行管理培训教材久久建筑网
  • 怎么建设微网站住房和城乡建设部网站第九批
  • 山东美建站昆明市最新消息
  • 珠海专业做网站公司wordpress 太慢
  • 保定seo企业网站Wordpress始于
  • 网站运营外包协议wordpress免费商城
  • 怎么做一个自己的网站阿里云域名注册平台
  • html网站开发工具全网营销渠道
  • 怎么分析竞争对手网站各大网站搜索引擎入口
  • 程序开发 网站开发怎样无货源开网店
  • 东海县网站建设苏州网站设计
  • 哈尔滨优化网站排名网页设计师联盟qq群
  • 专做外贸的网站有哪些资料重庆沙坪坝区房价
  • 建筑工程招标网站一个完整的项目策划书
  • 成立网站建设公司要求传统文化网站建设
  • 做静态网站辽宁建设工程信息网场内业绩
  • 没有服务器建网站ja.wordpress.org
  • 网站空间源码wordpress+短视频主题
  • 涡阳网站建设哪家好网站关键词怎么做效果好
  • 建企业网站 硬件手机怎样制作网页
  • 一个网站多个域名 seo做企业网站用服务器
  • 网站建设要注意些什么html底部友情链接代码
  • 没有logo可以做网站的设计吗app软件开发摄像头
  • 行业型网站 赢利点大冶seo网站优化排名推荐
  • 专业建站公司联系方式.net给网站做短信验证
  • 做网站需注意什么wordpress本地主题
  • 网站规划可以分成哪几步怎么制作小程序
  • 网站建设公司 选中企动力公司梧州房源信息网
  • 建设网站遇到的问题营销型国外网站
  • 网站的优化从几个方面行政机关 网站源码