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

《水利建设与管理》杂志社网站经典软文文案

《水利建设与管理》杂志社网站,经典软文文案,国内商务网络公司排名,做网站推广工作赚钱吗题目链接 题目描述 给你两个字符串 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/481137.html

相关文章:

  • 手机wap网站制作免费网络推广软件有哪些
  • 安阳+网站建设山西seo和网络推广
  • 镇江整站优化大连seo关键词排名
  • 龙华新区网站制作网站怎么营销推广
  • 中山做网站哪家公司好免费的网站推广方法
  • 苏州市政府网站建设评估网络营销专业学什么
  • wordpress用户名支持中文优化网站首页
  • 专业企业网站开发app开发软件
  • 佛山网站设计外包推广策划
  • 搭建网站源码引流推广网站
  • 做电子外贸网站建设qq营销软件
  • 日本做外贸网站设计网络营销专业学什么
  • 东莞做一个企业网站要多少钱怎么做盲盒
  • 长春互联网公司排名苏州百度 seo
  • 最牛的网站建设成人技能培训
  • 保定网站公司那家好百度推广seo优化
  • 中山营销型网站建设百度搜索关键词排名靠前
  • 百度提交wordpress长沙seo服务哪个公司好
  • 建个网站能赚钱吗微营销平台有哪些
  • 浙江网站建设费用重庆百度seo
  • 龙华民治网站建设公司深圳百度推广
  • 网站php源码web成品网站源码免费
  • 南宁网站怎么做seo东莞整站优化排名
  • 天津建设厅 注册中心网站重庆seo点击工具
  • app优化网站太原最新情况
  • 一个网站如何做推广方案大连企业黄页电话
  • 工商注册在哪个网站百度百度一下官网
  • 有什么可以下载软件的网站360推广登陆入口
  • 广州网站建设公司电话搜索引擎大全网站
  • 网站品牌词优化怎么做网络优化公司