原题描述
+
实现 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() 定义相符。
原题链接:https://leetcode-cn.com/problems/implement-strstr
思路解析
+
一般来说,解决这道题的方法是KMP算法。记得当时学数据结构的时候,KMP算法一直是我的噩梦,今天我用一种普通的回溯方法解决这道题。
我们假设haystack的长度为 ,needle的长度为 ,我们使用两个指针ph和pn分别指向haystack和needle的头部。
首先,只有当子串的第一个字符跟 needle 字符串第一个字符相同的时候才需要比较。通过递增ph,我们可以找到对应的位置。
然后,进入逐一匹配判断的阶段,一旦不匹配则立刻终止。
当匹配不正确时立即回溯pn指针到needle的开头,以便于和haystack后面的部分继续匹配。同时,ph指针也需要回溯到ph-curr_len+1处。
重复以上过程,当匹配成功时直接返回即可。
复杂度分析
+
C++参考代码
+
class Solution {
public:
int strStr(string haystack, string needle) {
int h = haystack.size(), n = needle.size();
if (!n) return 0;
int ph = 0;
while (ph < h - n + 1) {
while (ph < h - n + 1 && haystack[ph] != needle[0]) ++ph;
int curr_len = 0, pn = 0;
while (ph < h && pn < n && haystack[ph] == needle[pn]) {
++curr_len;
++ph;
++pn;
}
if (curr_len == needle.size()) return ph - curr_len;
ph = ph - curr_len + 1;
}
return -1;
}
};