版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_43480094/article/details/84794919
题目链接:https://leetcode-cn.com/problems/implement-strstr/description/
实现 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() 定义相符。
直接上代码吧
C 朴素匹配:
int strStr(char* haystack, char* needle) { int i = 0,j = 0; int len1 = strlen(haystack); int len2 = strlen(needle); if (*needle == '\0') return 0; while (i < len1 && j < len2) { if (haystack[i] == needle[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } return (j > len2-1)? i - len2 : -1; }
C++ KMP:
class Solution { public: int strStr(string haystack, string needle) { if (needle.empty()) return 0; int* nextar = next(needle); int i = 0,j = 0; int hay_len = haystack.size(); int nee_len = needle.size(); while (i < hay_len && j < nee_len) { if (j == -1 || haystack[i] == needle[j]) { i++; j++; } else { j = nextar[j]; } } free(nextar); return j >= nee_len ? i - nee_len : -1; } int* next(const string &s) { int* ar = new int[s.size()+1]; ar[0] = -1; int i = 0,j = -1; while (i < s.size()) { if (j == -1 || s[i] == s[j]) { i++; j++; if (s[i] != s[j]) ar[i] = j; else ar[i] = ar[j]; } else { j = ar[j]; } } return ar; } };
谢谢。