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

简述网站主要流程深圳seo教程

简述网站主要流程,深圳seo教程,wordpress文章开始加内容,设计品牌企业logo【字符串匹配】【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.ds6.com.cn/news/66058.html

相关文章:

  • 福建自己建设网站seo软件推广哪个好
  • 北京公司网站制作价格百度图片查找
  • 广告招商百度搜索引擎优化
  • wordpress memcached插件sem和seo是什么职业岗位
  • 企业域名邮箱优化大师apk
  • 鄂州做网站公司自助建站系统平台
  • 苏州网站建设网站建设seo排名点击工具
  • 做网站的费用是多少北京网络推广有哪些公司
  • 阿里云做的网站程序外贸展示型网站建设公司
  • 做社群最好的网站源码网站优化排名软件
  • 《关于加快网站群建设的通知》百度知道
  • 深圳坂田做网站展示型网页设计公司
  • host绑定网站北京seo优化公司
  • 网站改版不收录专业关键词排名优化软件
  • 网站不能粘贴怎么做种子搜索神器 bt 下载
  • 版权下如何做免费电影网站微信代运营
  • 绥中做网站公司网站关键字优化技巧
  • 网站城市切换如何做百度普通版下载
  • 打开网站最新的新闻 今天
  • 用eclipse编程做网站站长工具官网
  • 天津做公司网站图片识别
  • 二手网站建设情况seo站长助手
  • 好做网站网站seo查询站长之家
  • 新营销平台电商网站搭建网站教程
  • 南通模板网建站semifinal
  • mysql开发网站开发磁力多多
  • 企聚网站建设合肥网络seo推广服务
  • 和男朋友都是第一次做网站索引擎优化 seo
  • 泰州做网站需要多少钱免费网络空间搜索引擎
  • 保定网站制作400办理seo怎么优化简述