一:题目

二:思路


三:上码

// class Solution {// public:
// int strStr(string haystack, string needle) {//            if (needle.size()==0)
//             return 0;
//         if (needle.size() > haystack.size())
//             return -1;
//         int j=0;//用来指向needle的字符串
//         int i=0;
//         for (i = 0; i < haystack.size(); i++) {//             if (j==needle.size()){//如果已经匹配完成则返回
//                 return i - needle.size();
//             }
//             if (haystack[i] == needle[j]){//                 j++;
//             } else{//                 i -= j;
//                 j=0;
//             }
//         }
//         //用来判断单个字母的时候,j++之后j=1,i=1;
//         if (j==needle.size()){//             return i - needle.size();
//         }
//         return -1;
//     }
// };class Solution {public:void getNext(int* next,string s){//这里的是int i = 0;//表示前缀next[0] = 0;//一个字符的话公共前后缀肯定为0//j表示后缀for(int j = 1; j < s.size(); j++) {while(i > 0 && s[i] != s[j]) {//这里的i>0是为了保证i-1大于等于0i = next[i-1];//这里是往前推,也是相当于匹配字符问题,将前一个字符所对应的下标,赋值给i,// 然后字符串开始从i所对应字符开始匹配}if(s[i] == s[j]) {i++;}next[j] = i;        }
}int strStr(string haystack, string needle) {/**思路:1.KMP算法,主要处理的是字符串匹配的问题2.这里边需要用到next数组 也就是前缀表;那么我们为什么要用前缀表呢,当我们进行匹配字符的时候发现匹配到不相同的字符的时候,那么我们就需要在匹配字符串中查询前一个字符所对应的在前缀表表中的数值,根据数值找到对应的字符 让其重新作为匹配字符串的开始匹配的位置。3.那么我们怎么求取前缀表呢?首先先明白何为前缀、后缀、最长公共前后缀<1>:前缀:前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串eg:aabaaf其前缀可以是:aaaaabaabaaabaa<2>:后缀:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串eg:aabaaf其后缀可以是:fafaafbaafabaaf<3>:最长公共前后缀:也就是给定一个字符串,我们找到其前缀和后缀相等的最长部分 eg:字符串 公共的部分  公共部分的长度a                     0aa        a           1   aab                   0aaba      a           1 aabaa     aa          2aabaaf                0<4>:根据<3>求出的公共部分我们就可以求出next数组(前缀表)字符串:  a  a  b  a  a  f下  标: 0  1  2  3  4  5 next[]:  0  1  0  1  2  04.如何用next数组来进行匹配呢?被匹配的字符串:aabaabaaf匹配的字符串:aabaaf当匹配到f的时候发现f和b此时不匹配,那么我们就需要查询匹配字符串的前一个字符所对应的next数组中的数值,然后再从还数值所读应的字符开始匹配。回归示例就是我们的f前面的字符a对应的next数组中的数值是2,那么我们就从字符串的2位置对应的字符开始匹配也就是b*/if(needle.size() == 0) {return 0;}  int next[needle.size()];    getNext(next,needle);int j = 0;//代表被匹配的字符串for(int i = 0; i < haystack.size(); i++) {while(j > 0 && needle[j] != haystack[i]){j = next[j-1];}if(needle[j] == haystack[i]) {j++;}if(j == needle.size()){return (i-j+1);//可以类比hello  和 ll}}return -1;}
};

leetcode28. 实现 strStr(KMP详解)相关推荐

  1. C语言字符串库函数strlen、strcpy、strcat、strcmp、strstr使用详解及其实现

    写在前面:现在在刷简单题的时候,老是遇到字符串操作的题,用c语言自己实现很麻烦,其实c语言也有很多对字符串操作很方便的库函数.这个博客写来一是为了巩固自己一下自己学的知识,二也可以方便大家查询. 一. ...

  2. 【C库函数】 strstr函数详解

    目录 strstr 函数原型 参数详解 返回值详解 函数讲解 strstr 查找字符子串 函数原型 char *strstr( const char *str1, const char *str2 ) ...

  3. strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数 事例展示 函数介绍 函数声明:char *strstr(const char *str1, const char ...

  4. 字符串查找算法BF、KMP详解

    字符串查找: BF算法: (朴素查找算法) 当查找不成功时,主串返回刚刚起始字符的下一个,子串返回第一个字符位置 时间复杂度:O(n*m) int BF(const char* str, const ...

  5. Strstr和Strchr函数详解

    Strstr函数详解 Strstr函数原型 char *strstr( const char *string, const char *strCharSet ); Strstr函数功能 在一个字符串中 ...

  6. 奇淫巧技的KMP算法--详解

    奇淫巧技的KMP算法–详解 花了一下午时间,看了十几个博客,终于拿下了KMP高地,现在总结下下自己对KMP的理解和实现. 情景1 假如你是一名生物学家,现在,你的面前有两段 DNA 序列 S 和 T, ...

  7. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一 ...

  8. KMP算法详解及各种应用

    KMP算法详解: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题 ...

  9. C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)

    参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...

最新文章

  1. 知乎高赞:字节总监的开发手记!
  2. java制作程序启动进度窗口
  3. 物联网与零边际成本共享经济
  4. spring 第一天:1015
  5. kali linux 双显卡,Kali上双显卡驱动的安装
  6. 设置SVN忽略文件和文件夹(文件夹)
  7. js实现表格的行删除和增加_vue小demo之实现表格的增加和删除
  8. Tensorflow——Variable变量(打印数字小实例)
  9. linux查看cpt硬盘命令,Linux基础知识复习之命令篇
  10. 大数据Spark技术数据分析综合实验:出租车数据分析
  11. 什么软件能打开Android,哪位晓得apk文件用什么软件打开
  12. win10下, ColorPix取色器错位 指针偏移问题 解决方法
  13. Caused by: java.lang.SecurityException: Neither user 10068 nor current process has android.permissio
  14. VisibilityAwareImageButton.setVisibility can only be called from within the same library group (grou
  15. C语言float去尾法输出,c语言去尾法怎么写
  16. Markdown 引用Gitee图片外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  17. matlab三重积分计算方法,一般区域二重、三重积分MATLAB计算方法
  18. 【Matlab代码】Sierpinsk地毯
  19. “后网联时代”聚合支付发展方向思考
  20. 一个软件工程师必须是一个好的雕刻师

热门文章

  1. Git 合并分支选项 --squash 合并提交历史
  2. VS2019 禁止Web项目停止调试后自动关闭浏览器(在浏览器窗口关闭时停止调试程序,在调试停止时关闭浏览器)
  3. 【经典回放】多种语言系列数据结构算法:二叉树(C#版)
  4. Android之解决Android8.0手机(Notification)收不到自定义消息通知以及其它手机得到数据不同步
  5. linux之tr命令使用和总结
  6. Android之解决aidl里面函数参数太大不能跨进程通信的问题
  7. C++入门指南及实战 第二步 HelloWorld及扩展详解
  8. python绘制饼图双层_有趣!如何用Python-matplotlib绘制双层饼图及环形图?
  9. BBC又一神作,豆瓣9.8分,美轮美奂的大自然不仅仅属于人类
  10. 史上最低估自己的天才科学家!预言自己的发现无用,没想到影响全世界,可他却在37岁..........