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

leetcode 28 Find the Index of the First Occurrence in a String

 直接用kmp算法

class Solution {
public:int strStr(string haystack, string needle) {return kmp(haystack,needle);}int kmp(std::string &text,std::string &pattern){int n = text.size();int m = pattern.size();if(m == 0)return 0;std::vector<int> next;next.reserve(m);getNext(pattern,m,next);int j = -1;for(int i = 0;i < n;i++){while(j != -1 && text[i] != pattern[j+1]){j = next[j];}if(text[i] == pattern[j+1]){j++;}if(j == m-1)return i - j;}return -1;}void getNext(std::string &pattern,int len,std::vector<int> &next){next[0] = -1;int j = -1;for(int i = 1;i < len;i++){while(j != -1 && pattern[i] != pattern[j+1]){j = next[j];}if(pattern[i] == pattern[j+1])j++;next[i] = j;}}
};

或者另外一种写法,用的是部分匹配值(Partial Match)表

class Solution {
public:int strStr(string haystack, string needle) {return KMP(haystack,needle);}void getPM(std::string &pattern,int len,std::vector<int> &pm){pm[0] = 0;int j = 0;// j表示前缀的末尾元素的索引位置,同时它也是最长公共前后缀的长度//i表示后缀的末尾元素的索引位置for(int i = 1;i < len;i++){while(j > 0 && pattern[i] != pattern[j])j = pm[j-1];if(pattern[j] == pattern[i]) j++;pm[i] = j;}}int KMP(std::string &text,std::string& pattern){int m = pattern.size();if(m == 0) return 0;std::vector<int> pm;pm.resize(m);getPM(pattern,m,pm);int n = text.size();int j = 0;for(int i = 0;i < n;i++){while(j > 0 && text[i] != pattern[j])j = pm[j-1];if(text[i] == pattern[j]) j++;if(j == m)return i-j+1;}return -1;}
};


http://www.mrgr.cn/news/96486.html

相关文章:

  • Jmeter的压测使用
  • 从PDF到精准答案:Coze助力RAGFlow框架提升数据召回率
  • 源码刨析与插入实现:RBT比AVL强在何处?
  • SpringBoot实现RBAC权限校验模型
  • C++进阶——位图+布隆过滤器+海量数据处理
  • 小学数学解题方法专题3-列表法-提升2
  • 3.27学习总结 爬虫+二维数组+Object类常用方法
  • RocketMQ - 从消息可靠传输谈高可用
  • 在Qt中判断输入的js脚本是否只包含函数
  • fluent_UDF学习笔记
  • 横扫SQL面试——连续性登录问题
  • 在bootstrap下实现万年历
  • Muduo网络库实现 [二] - Buffer模块
  • 基于自定义注解+反射+AOP+Redis的通用开关设计:在投行交易与风控系统的落地实践
  • SpringBoot 概述
  • Dubbo分布式开发框架
  • 机器学习课程
  • 深入解析音频:格式、同步及封装容器
  • 一文聊聊接入钉钉H5微应用系统实现免登操作技术思路实现验证
  • 【导航定位】GNSS数据协议-RINEX OBS