1.一道字符串匹配题:

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

链接:https://leetcode-cn.com/problems/implement-strstr/

2.暴力解法:

//暴力法 O(M*N)
class Solution {
public:int strStr(string haystack, string needle) {if(needle.size() == 0) return 0;int i = 0,j = 0,ans = -1;while(i < haystack.size() && j < needle.size()){if(haystack[i] == needle[j]){i++;j++;}else{i = i - j + 1;j = 0;}}if(j == needle.size()) ans = i - j;return ans;}
};

3.KMP算法

参考链接:

https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

class Solution {
public:int strStr(string haystack, string needle) {if(needle.size() == 0){return 0;}int len1 = haystack.size();int len2 = needle.size();vector<int> next(needle.size());int i = 0,j = -1;next[0] = -1;while(i < len2 - 1){if(j == -1 || needle[i] == needle[j]){i++;j++;if(needle[i] != needle[j])//如果当前没有匹配上的这个字符不等于它下一次要跳的字符{next[i] = j;}else //若两个字符相等,跳到这个字符之前应该跳的地方{next[i] = next[j];}}else{j = next[j];}}i = 0,j = 0;while(i < len1 && j < len2)//注意string.size() 返回值为size_type 为无符号数 若用负数与其相比 则负数会转化为无符号数{if(j == -1 || haystack[i] == needle[j]){i++;j++;}else{j = next[j];}}if(j == len2) return i - j;return -1;}
};

4.BM算法

https://www.cnblogs.com/xubenben/p/3359364.html

class Solution {
public:void get_bmbs(string &x,vector<int> &p){int len = x.size();for(int i = 0;i < 256;++i)//ASCII码共256个字符{p.push_back(len);}for(int i = 0;i < len - 1;++i)//注意小于len - 1{p[x[i]] = len - 1 - i;}}void get_suffix(string &x,vector<int> &p){int len = x.size();p[len - 1] = len;for(int i = len - 2;i >= 0;--i){int q = i;while(q >= 0 && x[q] == x[len - 1 - i + q]){--q;}p[i] = i - q;}}void get_bmgs(string &x,vector<int> &p){int len = x.size();vector<int> suffix(len);get_suffix(x,suffix);for(int i = 0;i < len;++i){p.push_back(len);}int j = 0;for(int i = len - 1;i >= 0;--i){if(suffix[i] == i + 1){for(;j < len - 1 - i;++j){if(p[j] == len){p[j] = len - 1 - i;}}}}for(int i = 0;i < len - 1;i++){p[len - 1 - suffix[i]] = len - 1 - i;}}int strStr(string haystack, string needle) {if(needle.size() == 0) return 0;vector<int> bmbs,bmgs;get_bmbs(needle,bmbs);get_bmgs(needle,bmgs);int i = 0;int n = haystack.size();int m = needle.size();while(i <= n - m){int j = m - 1;while(j >= 0 && needle[j] == haystack[i + j]){--j;}if(j < 0) return i;i += max(bmbs[haystack[i + j]]-(m - 1 - j),bmgs[j]);//j为当前失配的地方 bmds找的是当前            }return -1;}
};

字符串匹配的三种算法相关推荐

  1. Java 字符串匹配的三种方法

    文章目录 一.示例 二.解释 1.replace()方法 2.replaceAll()方法 3.replaceFirst()方法 4.常用的字符列表 一.示例 如图,都是为了替换字符串s中的" ...

  2. 爱因斯坦谜题解答(三种算法比较)

    爱因斯坦谜题:     在一条街上有颜色互不相同的五栋房子,不同国籍的人分别住在这五栋房子力,每人抽不同品牌的香烟,喝不同的饮料,养不同的宠物.已知如下情况: 1.  英国人住红色房子里. 2.  瑞 ...

  3. 创建字符设备的三种方法

    将创建字符设备的三种方法记录一下,以便以后参考. 1. 使用早期的register_chardev()方法 #include<linux/kernel.h> #include<lin ...

  4. EL之DTRFGBT:基于三种算法(DT、RF、GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能

    EL之DT&RF&GBT:基于三种算法(DT.RF.GBT)对泰坦尼克号乘客数据集进行二分类(是否获救)预测并对比各自性能 目录 输出结果 ​设计思路 核心代码 输出结果 设计思路 核 ...

  5. java 求最大公因数_求最大公约数的三种算法(java实现)

    三种算法: //欧几里得算法(辗转相除): public static int gcd(int m,int n) { if(m int k=m; m=n; n=k; } //if(m%n!=0) { ...

  6. SQL Server 索引基础知识(10)----Join 时的三种算法简介

    我们书写查询语句的时候,Join 参数之前可以是下面三个 { LOOP | MERGE | HASH } JOIN  . 如果不使用,则系统自己分析那种方式快,使用那种方式. 这其实是SQL Serv ...

  7. c语言求最小公倍数和最大公约数三种算法

    C语言求最小公倍数和最大公约数三种算法(经典) 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b ...

  8. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  9. C语言求最小公倍数和最大公约数三种算法(经典)

    C语言求最小公倍数和最大公约数三种算法(经典) 最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为 ...

最新文章

  1. 2021-2027年中国医联体(医疗联合体)建设深度调研及投资前景预测报告
  2. 计算机房电源解决方案,apcups电源小型机房电源解决方案
  3. 基于VC++开发串口通信的方法
  4. Oracle11g新特性注意事项
  5. 与登录shell相关的文件
  6. jboss fuse 教程_在JBoss Fuse / Fabric8 / Karaf中使用Byteman
  7. 视频光端机常见故障问题及处理方法大全
  8. Windows上PostgreSQL安装配置教程
  9. 关于mysql的一些时间格式和字符的问题
  10. 00003-回文数的判定-leetcode-解法不唯一,1.reverse最简单,2.数学方法很有意思
  11. row number函数 oracle,oracle函数 ROW_NUMBER()
  12. java 钩子 64位 操作系统_Java与系统钩子
  13. 2021下半年软考网络工程师上午真题(二)
  14. SNAP7 C++ 通讯
  15. 使用Visio 2003 + Oracle 11g创建ERD,反向工程师失败了吗?
  16. mysql按经纬度排序_mysql根据经纬度查找排序
  17. 用计算机弹九八k的乐谱,抖音计算器按出的音乐乐谱有哪些 抖音计算器乐谱汇总...
  18. 小程序 实现星星评分(共10分),含有半星
  19. 准备好收集 BreederDAO 徽章了吗?
  20. 初中计算机卡片的制作教案,卡片的制作教案..doc

热门文章

  1. mac上最好用的5款epub阅读器
  2. 解决虚拟机中centos7中安装完毕后无法联网显示Server not found如何解决?
  3. clamav Java_杀毒软件包clamav部署-CentOS6.5
  4. 计量经济学及Stata应用 第四章习题
  5. Git学习笔记(二)
  6. 6-TCP 协议(序号和确认号)
  7. java先删后保存数据库据功能,还在手工生成数据库文档?3个步骤自动完成了解一下...
  8. Problem C: 零起点学算法95——弓型矩阵
  9. 浅谈喝汽水问题————能用数学解决为什么要用递归
  10. C++ Socket网络编程1.6版本 添加高精度计时器测量处理能力