C语言重构【28】实现 strStr()【KMP版】 你的名字 2022-12-08 12:52 193阅读 0赞 ### 文章目录 ### * * * * 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) * 题目 * 方案: #### 所有题目源代码:[Git地址][Git] #### #### 题目 #### 实现 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() 定义相符。 #### 方案: #### * 本题就是典型的KMP算法实现题 #include <iostream> #include <vector> using namespace ::std; //KMP 算法 class Solution { public: int strStr(string haystack, string needle) { if (needle.empty()) return 0; int i = 0, m = haystack.size(); int j = 0, n = needle.size(); vector<int> nextVal = get_nextVal(needle); while (i<m&&j<n) { if(j==-1||needle[j]==haystack[i])i++,j++; else j = nextVal[j]; } return j==n?i-j:-1; } vector<int> get_next(const string &pat) { int n=pat.size(); vector<int> next(n+1,-1); int k=-1,j=0; while(j<n){ if(k==-1||pat[k]==pat[j]) next[++j]==++k; else k = next[k]; } return next; } vector<int> get_nextVal(const string &pat) { int n = pat.size(); vector<int> nextVal(n, -1); int k = -1, j = 0; while (j < n - 1) { if (k == -1 || pat[k] == pat[j]) { k++, j++; if (pat[j] != pat[k]) nextVal[j] = k; else nextVal[j] = nextVal[k]; } else { k = nextVal[k]; } } return nextVal; } }; [Git]: https://github.com/ch98road/leetcode
相关 C语言重构【258】各位相加 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 一时失言乱红尘/ 2022年12月28日 11:21/ 0 赞/ 201 阅读
相关 C语言重构【55】跳跃游戏 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 灰太狼/ 2022年12月28日 04:26/ 0 赞/ 143 阅读
相关 C语言重构【42】接雨水 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) ゝ一世哀愁。/ 2022年12月25日 09:56/ 0 赞/ 154 阅读
相关 C语言重构【28】删除链表的倒数第N个节点 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 男娘i/ 2022年12月09日 14:54/ 0 赞/ 85 阅读
相关 C语言重构【28】实现 strStr()【KMP版】 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 你的名字/ 2022年12月08日 12:52/ 0 赞/ 194 阅读
相关 C语言重构【494】目标和 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 迈不过友情╰/ 2022年11月06日 11:53/ 0 赞/ 182 阅读
相关 C语言重构【134】加油站 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 爱被打了一巴掌/ 2022年10月29日 11:18/ 0 赞/ 208 阅读
相关 C语言重构【1025】除数博弈 文章目录 所有题目源代码:\[Git地址\](https://github.com/ch98road/leetcode) 叁歲伎倆/ 2022年10月26日 04:56/ 0 赞/ 200 阅读
相关 小朋友学C语言(28):指针 (一)内存地址 include <stdio.h> int main() { int var1 = 20; 痛定思痛。/ 2022年06月05日 23:56/ 0 赞/ 399 阅读
还没有评论,来说两句吧...