leetcode28.实现strStr() (Implement strStr())

匿名 (未验证) 提交于 2019-12-02 23:00:14
版权声明:本文为博主原创文章,未经博主允许不得转载。 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;     } };

谢谢。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!