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

面试经典 150 题 22 —(数组 / 字符串)— 28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标

在这里插入图片描述

方法一
class Solution {
public:int strStr(string haystack, string needle) {if(haystack.find(needle) == string::npos){return -1;}return haystack.find(needle);}
};
方法二
class Solution {
public:int strStr(string haystack, string needle) {int haystackLength = haystack.length();int needleLength = needle.length();int haystackIndex = 0, needleIndex = 0;while(haystackIndex < haystackLength){if(haystack[haystackIndex] != needle[needleIndex]){// 如果不相等,haystack从最开始匹配相等的地方重新进行haystackIndex = haystackIndex - needleIndex; // needle从头开始needleIndex = 0;}else{if(needleIndex == needleLength-1){return haystackIndex-needleLength+1;}needleIndex++;}haystackIndex++;}return -1;}
};
class Solution {
public:int strStr(string haystack, string needle) {int haystackLength = haystack.size(),needleLength = needle.size();if(needleLength == 0){return 0;}// KMP算法:如果已经匹配的字符串包含相同的前缀和后缀,遇到下一个不匹配的位置时,指向needle的指针跳转到前缀的后一个位置,还是不匹配的话,再往前跳转后继续比较;先构造一个next数组来记录needle指针跳转的位置// 先构造next数组,next数组中的元素表示当前两个元素不匹配时,needle指针要跳转的位置// haystack: [a, b, e, a, b, a, b, e, a, b, f]// needle:   [a, b, e, a, b, f]// next:     [0, 0, 0, 1, 2, 0]vector<int> next(needleLength);for(int i=1,j=0; i<needleLength; i++){while(j>0 && needle[i]!=needle[j]) {j = next[j-1]; // 一直和前一位置的值比较,直到遇到相等的字符或者j=0;j通过next[j-1]来回退}if(needle[i]==needle[j]){j++;};next[i] = j;}// 利用next数组进行跳转匹配,不再需要回退haystack的指针ifor(int i=0,j=0; i<haystackLength; i++){// 匹配不成功,needle指针j回退并继续比较while(j>0 && haystack[i]!=needle[j]){j = next[j-1];}if(haystack[i]==needle[j]){j++;}if(j==needleLength){return i - needleLength + 1;}}return -1;}
};
http://www.lryc.cn/news/188589.html

相关文章:

  • 儿童产品亚马逊CPC认证审核不通过的原因解析
  • 项目_数据可视化| 折线图.散点图.随机漫步
  • Android 项目增加 res配置
  • MySQL数据库的MVCC详解
  • AI:10-基于TensorFlow的玉米病害识别
  • vue3前端开发系列 - electron开发桌面程序(2023-10月最新版)
  • 前端uniapp生成海报并保存相册
  • 0基础学习VR全景平台篇 第104篇:720全景后期软件安装
  • CMakeLists编译前拷贝文件或目录
  • mysql面试题35:MySQL有关权限的表有哪些?
  • ES6:什么是Symbol_
  • E. Li Hua and Array
  • 【项目】在线oj
  • 第十章-输入输出系统
  • TensorFlow学习:使用官方模型进行图像分类、使用自己的数据对模型进行微调
  • Matlab地理信息绘图—研究区域绘制
  • [CSAWQual 2019]Web_Unagi - 文件上传+XXE注入(XML编码绕过)
  • ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的问题解决
  • 什么是函数库和动态链接库?
  • POM配置
  • 微电网单台并网逆变器PQ控制matlab仿真模型
  • 计算机毕业设计选什么题目好?springboot 旅游网站
  • Android Fragment中使用Arouter跳转到Activity后返回Fragment不回调onActivityResult
  • hive add columns 后查询不到新字段数据的问题
  • 【linux】权限相关问题
  • “.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“一
  • 02-RocketMQ开发模型
  • 第83步 时间序列建模实战:Catboost回归建模
  • 开源任务调度框架
  • Android Native 开发 要点记录