实现 strStr()

LeetCode第28题

题目描述:
实现 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() 定义相符。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr

思路

此题为字符串匹配算法,暴力法是用两个循环,一个个的比对。复杂度为平方级别。
使用KMP算法可降低复杂度。之前学过KMP算法,不过next数组下标是从1开始的。这次子串下标从0开始,不想查资料了,自己从下午想到晚上,一步步的搞出来了。

源代码

int strStr(char * haystack, char * needle){
    int needle_len = strlen(needle);

    if(needle_len == 0)
        return 0;
    int next_size = needle_len + 1;
    int *next = malloc(sizeof(int) * next_size);
    get_next(needle,next,needle_len);

    int i = 0;
    int j = 0;
    while(i < strlen(haystack)){
        if(j == -1 || haystack[i] == needle[j]){    //这个地方判断顺序不能错,否则下标可能为-1而越界
            ++i;
            ++j;
        }
        else{
            j = next[j];
        }
        if(j == needle_len)
            return (i - needle_len);
    }
    return -1;
}

//KMP算法
void get_next(char T[],int *next,int len){
    next[0] = -1;
    next[1] = 0;
    int i = 0;
    int j = 1;
    while(j < len){
        if(i == -1 || T[i] == T[j]){      //这个地方判断顺序不能错,否则下标可能为-1而越界
            ++i;
            ++j;
            next[j] = i;
        }
        else{
            i = next[i];
        }
    }
}

分析

时间复杂度为线性级别,空间复杂度为常数级别。

你可能感兴趣的:(实现 strStr())