[LeetCode] Implement strStr()

Implement strStr()

Implement strStr().

Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.

方法:KMP

正好趁这个题目温习了一下KMP字符串匹配。母串S, 模式串P

KMP算法是利用模式串P本身的特性来降低复杂度。通过next函数or覆盖函数来优化。

本质上,next函数/覆盖函数是overlap[i]是求出P[0~i]内的最大的前缀P[0~i-x]和后缀P[x~i]的长度。

#include <cstring>
#include <iostream>
using namespace std;

class Solution {
    public:
        char *strStr(char *haystack, char *needle) {
            int lenh = strlen(haystack);
            int lenn = strlen(needle);
            if (lenn == 0) return haystack;
            int idx = kmp_search(haystack, needle, lenh, lenn);
            if (idx == -1) return NULL;
            else return haystack + idx;
        }
        
        int kmp_search(char* t, char* p, int lt, int lp) {
            int *over = new int[lp];
            calc_overlap(over, p);
            int k = -1;
            for (int i = 0; i < lt; ++i) {
                while (k >= 0 && p[k+1] != t[i])
                    k = over[k];
                if (p[k+1] == t[i]) k++;
                if (k == lp - 1) return i - k;
            }
            return -1;
        }

        void calc_overlap(int *over, char *str) {
            over[0] = -1;
            int k = -1;
            for (int i = 1; i < strlen(str); ++i) {
                while (k >= 0 && str[k+1] != str[i])
                    k = over[k];
                if (str[k+1] == str[i]) k++;
                over[i] = k;
            }
        }
};

 

N^2

class Solution {
public:
    char *strStr(char *haystack, char *needle) {
        int l1 = strlen(haystack);
        int l2 = strlen(needle);
        if (l2 == 0) return haystack;
        
        char *s = haystack;
        while (*s != '\0') {
            if (l1 < l2) return NULL;
            if (cmp(s, needle)) return s;
            s++;
            l1--;
        }
        return NULL;
    }
    
    bool cmp(char* hay, char* ne) {
        while (*hay != '\0' && *ne != '\0') {
            if (*hay == *ne) { hay++, ne++; continue; }
            else return false;
        }
        if (*ne == '\0') return true;
        else return false;
    }
};

猜你喜欢

转载自cozilla.iteye.com/blog/1748385
今日推荐