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];
}
}
}
分析
时间复杂度为线性级别,空间复杂度为常数级别。