文章目录
- 一、题目
- 二、暴力穷解法
- 三、KMP算法
- 四、完整代码
所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
一、题目
二、暴力穷解法
思路分析:首先判断字符串是否合法,然后利用for循环,取出子字符串利用compare函数进行比较。
程序如下:
class Solution {
public:
// 复杂度n * m
int strStr(string haystack, string needle) {
if (haystack.size() < needle.size()) return -1;
if (!needle.size()) return 0; // needle为空返回0
for (int i = 0; i < haystack.size(); ++i) {
string substr = haystack.substr(i, needle.size());
if (!needle.compare(substr)) return i;
}
return -1;
}
};
复杂度分析:
- 时间复杂度: O ( n ∗ m ) O(n * m) O(n∗m),假设haystack的长度为n,needle的长度为m,for循环的复杂度为n,当中调用了compare函数,它是逐字符比较的,复杂度为m,因此总复杂度为 O ( n ∗ m ) O(n * m) O(n∗m)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
三、KMP算法
思路分析:
程序如下:
复杂度分析:
- 时间复杂度: O ( n + m ) O(n + m) O(n+m)。
- 空间复杂度: O ( ) O() O()。
四、完整代码
end