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

《水利建设与管理》杂志社网站绍兴seo公司

《水利建设与管理》杂志社网站,绍兴seo公司,mandy wordpress模版,上海工商局企业查询题目链接 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 示例 1: 输入&…

题目链接

题目描述

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:

输入:haystack = “sadbutsad”, needle = “sad”
输出:0
解释:“sad” 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:

输入:haystack = “leetcode”, needle = “leeto”
输出:-1
解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1 。

提示:

1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成

题解

1.暴力解法

思路:

  • 双指针扫描:
    – i指针遍历主串
    – j指针遍历模式串
  • 逐字符比对
    –当 haystack[i] == needle[j] 时,双指针共同前进
    –出现不匹配时,i 回溯到本次匹配的起始位置+1,j 重置为0
  • 终止条件
    –若 j 走完整个模式串 → 匹配成功,返回 i-j
    –若 i 走完主串但 j 未走完 → 匹配失败,返回-1
    请添加图片描述

自己写

class Solution {
public:int strStr(string haystack, string needle) {int i=0,j=0;while(i<=haystack.size()-needle.size()){if(haystack[i]==needle[j]){i++;j++;if(j==needle.size()){return i-j;}}else{i=i-j+1;j=0;}}return -1;}
};

问题在于while(i<=haystack.size()-needle.size())
我本来的想法是当主串剩余的字符数比子串还少时,肯定不能匹配成功了,但是在匹配过程中i可能会大于haystack.size()-needle.size()

正确版本代码

 class Solution {
public:int strStr(string haystack, string needle) {int i=0,j=0;while(i<haystack.size()&& j<needle.size()){if(haystack[i]==needle[j]){i++;j++;}else{i=i-j+1;j=0;}}return j==needle.size()?(i-j):-1;}
};

KMP算法

核心难点在于求Next数组,Next数组用于next数组用于记录模式串中每个位置的最长公共前后缀长度

求next数组思路

  • 初始化Next数组
  • 处理元素不相同情况
  • 处理元素相同情况
  • 更新next数组

strStr函数思路

  • 初始化:
    主串指针i = 0,模式串指针j = 0。
    调用getNext函数构造next数组。
  • 匹配逻辑:
    遍历主串haystack:
    –如果j > 0且haystack[i] != needle[j],说明当前字符不匹配,模式串指针j回溯到next[j - 1]。
    –如果haystack[i] == needle[j],说明当前字符匹配,j加1。
    –如果j等于模式串的长度(j == needle.size()),说明模式串完全匹配,返回匹配的起始位置i - j + 1
  • 返回值:
    如果匹配成功,返回模式串在主串中的起始位置。
    如果匹配失败,返回-1。

代码书写

class Solution {
public:void getNext(int*next,const string& s){//1.初始化next[0]=0;int i=1,j=0;for(i=1;i<s.size();i++){//2.处理不相同 回溯while(j>0&&s[i]!=s[j]){j=next[j-1];}//3.处理相同if(s[i]==s[j])j++;//4.更新Next数组next[i]=j;}} int strStr(string haystack, string needle) {//i作为主串的指针,j作为模式串的指针int i=0,j=0;vector<int> next(needle.size());getNext(&next[0],needle);for(;i<haystack.size();i++){while(j>0&&haystack[i]!=needle[j]){j=next[j-1];}if(haystack[i]==needle[j])j++;if(j==needle.size()){return i-j+1;}}return -1;}
};
易错点
  • 求next数组时,在处理不相同情况while(j>0&&s[i]!=s[j])是使用while而不是if
    请添加图片描述

http://www.dtcms.com/wzjs/436443.html

相关文章:

  • 企业网站建设原则百度最新秒收录方法2021
  • 学做网站开发吗如何创建网址
  • 网站后台管理系统功能网站设计
  • wordpress 幻灯片手机端字体seo站内优化和站外优化
  • 动画制作过程常州谷歌优化
  • 什么软件可以免费查企业电话seo上海培训
  • 公司支付网站款做凭证吉林seo外包
  • 东营做网站建设的公司nba球队排名
  • 自己的网站首页背景怎么做网站seo入门基础教程
  • myeclipse做网站更改名字网络推广人员
  • 百胜网站建设网络营销怎么推广
  • 电视看b站直播我们seo
  • axsure建设网站三只松鼠软文范例500字
  • 中文网站的seo怎么做搭建一个网站需要多少钱
  • 淄博建网站多少钱磁力搜索引擎不死鸟
  • 摄影网站设计模板seo网站页面优化包含
  • 婚纱摄影网站排名网站搭建软件
  • 做网站智能工具附子seo教程
  • 专做排名的网站收录优美的图片
  • 新网 网站空间详细描述如何进行搜索引擎的优化
  • 网站开发展示如何提高seo关键词排名
  • 自己做的网站如何加视频百度做推广一般要多少钱
  • 顺的网站建设策划个人免费网站创建入口
  • 上市公司做家具网站百度旗下的所有产品
  • 在线做漫画的网站疫情防控最新政策
  • 怎么自己做网站链接品牌推广宣传词
  • 触屏网站meta标签淘特app推广代理
  • phpcms 怎么做视频网站怎么制作网页推广
  • 怎么做b2b网站技成培训网
  • 家庭清洁东莞网站建设技术支持seo是搜索引擎优化吗