[LeetCode] 实现strStr()

实现 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() 定义相符。

class Solution {
public:
    int strStr(string haystack, string needle) {
        
        int n1 = haystack.size();
        int n2 = needle.size();
        int count = 0;
        if(n2 == 0) return 0;
        if(n1 < n2) return -1;
        int p2 = 0;
        
        for(int i = 0;i< n1-n2+1 ;i++){
            if(haystack[i] == needle[p2]){
               int p1 = 1;
                for(;p1 < n2; p1++){
                    if(haystack[i+p1] != needle[p1]){
                        break;
                    }
                }
                if(p1 == n2) return i;
                
            }
        }
        return -1;
        
    }
};

还有一种更加高效的算法:KMP算法 参考了https://www.cnblogs.com/yjiyjige/p/3263858.html,讲的很详细。

自己试着写了一下,结果还是有点问题......,先贴上来,后面再改正.......

class Solution {
public:
     
      vector * kmp_next(string &m){
         static vector next(m.length());
        next[0] = -1;
        int j = 0;
        int k = -1;
        int m_len = m.length();
        while( j < m_len - 1){
            if(k == -1 || m[k] == m[j]) next[++j] = ++k;            
            else k = next[k];
        }
       return &next;
    }
    
     int strStr(string haystack, string needle) {    
         int i = 0,j = 0;  
         vector * next=kmp_next(needle);
         int h_len = haystack.length();
         int n_len = needle.length();
         
         while(i < h_len && j 

别人实现的c++版本:

class Solution 
{
public:
    void getNext(string p,int *next)
    {
        int p_len = p.length();
        int j,k;
        next[0] = -1;
        j = 0;
        k = -1;
        while(j

 

你可能感兴趣的:(C++,数据结构)