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

高清的网站建设旺道seo工具

高清的网站建设,旺道seo工具,电商网站建设意义,嘉兴网站推广平台【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标 (1)前缀和后缀(2)前缀表(最长相同的前缀和后缀的长度)(3)匹配过程示意(4)next数组的…

【字符串匹配】【KMP算法】Leetcode 28 找出字符串中第一个匹配项的下标

    • (1)前缀和后缀
    • (2)前缀表(最长相同的前缀和后缀的长度)
    • (3)匹配过程示意
    • (4)next数组的实现方法
      • 1.初始化
      • 2.处理前后缀不相等的情况 :
      • 3.处理前后缀相同的情况:
      • 4.求next数组的程序:
  • 题目做法
    • 解法1 KMP算法
    • 解法2 暴力做法

---------------🎈🎈题目链接🎈🎈-------------------

在这里插入图片描述


🔴任务:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf

(1)前缀和后缀

前缀是指不包含最后一个字符的,所有以第一个字符开头的连续子串。
比如aabaaf的前缀包括:a,aa,aab,aaba,aabaa
后缀是指不包含第一个字符的,所有以最后一个字符结尾的连续子串。
比如aabaaf的后缀包括:f,af,aaf,baaf,abaaf

(2)前缀表(最长相同的前缀和后缀的长度)

前缀表(最长相同的前缀和后缀的长度)
前缀表(最长相同的前缀和后缀的长度)
前缀表(最长相同的前缀和后缀的长度)
作用:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀

模式串aabaaf的前缀表:

字符串最长相等前后缀
a0
aa1
aab0
aaba1
aabaa2
aabaaf0

前缀表的任务:当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配。
也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。

文本串aabaabaaf
模式串下标012345
模式串aabaaf
–前缀表–010120

当匹配到 b 的时候,模式串为 f ,匹配失败。
于是寻找 f 前面的字符串 aabaa, 他的最长相等前缀和后缀字符串是 aa , 因为找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面(即前缀表中发现冲突位置的前面的字符串——aabaa对应的前缀表为【2】,因此找到模式串中下标索引为【2】的位置 —— b 的位置开始)重新匹配就可以了。

文本串aabaabaaf
模式串aabaaf

(3)匹配过程示意

在这里插入图片描述

(4)next数组的实现方法

next数组详解视频!
代码随想录文字版
!!!!!代码随想录视频版本!!!!!

1.初始化

【i:后缀的末尾】初始化为1,
【j:前缀的末尾】初始化为0 , next [ 0 ] = 0
j:也代表了i包括i之前的字符串的最长相等前后缀长度

2.处理前后缀不相等的情况 :

j连续回退 ———— j=next [ j-1 ], (在j大于0的情况下)

3.处理前后缀相同的情况:

j++  →  更新next数组:next [ i ] = j   →    i++

4.求next数组的程序:

1.初始化 【i:后缀的末尾】初始化为1,  【j:前缀的末尾,也代表i包括i前字符的最长相等前后缀长度】初始化为0 ,   next[0] = 0
2.处理前后缀不相等的情况
3.处理前后缀相同的情况//求前缀表nextprivate void getNext(int[] next, String s){int j = 0;  // 初始化j为前缀末尾0,i为后缀的末尾next[0] = 0;for(int i = 1; i < s.length(); i++){ while(j > 0 && s.charAt(j) != s.charAt(i)){ j = next[j-1];}if(s.charAt(j) == s.charAt(i)){ // 如果相同,前缀末尾j++j++;}next[i] = j;  // 将前缀的长度给next[i]}} 

题目做法

解法1 KMP算法

时间复杂度O(N)
空间复杂度O(N)

  class Solution {public int strStr(String haystack, String needle) {if(haystack.length() < needle.length()) return -1;int[] next = new int[needle.length()];getNext(next, needle);int j = 0;for(int i = 0; i < haystack.length(); i++){while(j>0 && needle.charAt(j) != haystack.charAt(i)){ j = next[j-1];}if(needle.charAt(j) == haystack.charAt(i)){j++;}if(j == needle.length()) {return i-needle.length()+1;}}return -1;}//求前缀表nextprivate void getNext(int[] next, String s){int j = 0;  // 初始化j为前缀末尾0,i为后缀的末尾next[0] = 0;for(int i = 1; i < s.length(); i++){ while(j > 0 && s.charAt(j) != s.charAt(i)){ j = next[j-1];}if(s.charAt(j) == s.charAt(i)){ // 如果相同,前缀末尾j++j++;}next[i] = j;  // 将前缀的长度给next[i]}} 
}

解法2 暴力做法

从大字符串的第一个元素开始,比对小字符串,一旦出现不一样的就从大字符串的下一个元素开始进行比对
如果小字符串遍历结束时都一样,则return对应的下标
如果大字符串遍历完小字符串还没遍历完,return-1
遍历完大字符串前都找不到的话就return -1

时间复杂度O(N^2)
空间复杂度O(N)

class Solution {public int strStr(String haystack, String needle) {// 暴力做法char[] ch1 = haystack.toCharArray();char[] ch2 = needle.toCharArray();int result = -1;for(int i = 0; i < ch1.length; i++){ // haystack的遍历if(ch1[i] == ch2[0]){int outside = i;int inside = 0;while(ch1[outside] == ch2[inside]){outside++;inside++;if(inside == ch2.length){return outside-ch2.length;}else if(outside == ch1.length){return result;}}}}return result;}
}
http://www.yidumall.com/news/83050.html

相关文章:

  • 网站拉圈圈接口怎么做友情链接的定义
  • 响应式网站费用全网推广公司
  • 河北网站建设大全权威解读当前经济热点问题
  • wordpress 自动推送百度广州seo公司排名
  • 建设网站有什么风险软文标题
  • 非经营备案网站能贴放广告么天津seo标准
  • 长沙找人做企业网站文案全网推广哪家正宗可靠
  • 网站开发需求分析包括哪些方面淘宝关键词排名怎么查
  • linux系统如何做网站南京seo推广公司
  • 平台推广员是干嘛的中国seo关键词优化工具
  • 外国网站在内地做seo厦门网站建设
  • 五屏网站建设哪家有百度指数分析案例
  • 可以自己做免费网站吗代运营电商公司排行榜
  • 电商食品网站建设百度搜索关键词技巧
  • 德州企业做网站多少钱开源cms建站系统
  • 信誉好的镇江网站优化全网最低价24小时自助下单平台
  • 领手工在家做的网站成都专门做网站的公司
  • h5建站网站安徽关键词seo
  • 独立网站建站公司申请网站怎样申请
  • 肯德基网站开发seo运营是什么意思
  • 伊春网站推广seo的基本步骤
  • 做影视网站须要注意什么seo实战优化
  • 做赌场网站代理东莞产品网络推广
  • 网站开发建设方案的主要内容包括自己怎么创建网站
  • 如何建设网站兴田德润简介呢年轻人不要做网络销售
  • 网站建设更新不及时互联网营销公司
  • 电脑购物网站模板短视频运营
  • 网站开发培训广西win7优化大师
  • 动画制作专业就业前景郑州企业网站seo
  • 日常生活用品设计seo优化排名怎么做