File tree Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Expand file tree Collapse file tree 1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Time Complexity: O(m + n)
2
+ // Space Complexity: O(n)
3
+
4
+ class Solution {
5
+ public:
6
+ char *strStr (char *haystack, char *needle) {
7
+ string target (haystack);
8
+ string pattern (needle);
9
+
10
+ if (target.size () < pattern.size ())
11
+ return nullptr ;
12
+
13
+ if (pattern.size () == 0 )
14
+ return haystack;
15
+
16
+ int i = kmp (target, pattern);
17
+
18
+ return (i != -1 )? haystack + i : nullptr ;
19
+ }
20
+ private:
21
+ int kmp (const string &target, const string &pattern) {
22
+ const auto m = target.size ();
23
+ const auto n = pattern.size ();
24
+
25
+ vector<int > failure (n, -1 );
26
+ for (int i = 1 , j = -1 ; i < n; ++i) {
27
+ while (j >= 0 && pattern[j + 1 ] != pattern[i])
28
+ j = failure[j];
29
+ if (pattern[j + 1 ] == pattern[i])
30
+ ++j;
31
+ failure[i] = j;
32
+ }
33
+
34
+ for (int i = 0 , j = -1 ; i < m; ++i) {
35
+ while (j >= 0 && pattern[j + 1 ] != target[i])
36
+ j = failure[j];
37
+ if (pattern[j + 1 ] == target[i])
38
+ ++j;
39
+ if (j == n - 1 ) {
40
+ return i - j;
41
+ }
42
+ }
43
+
44
+ return -1 ;
45
+ }
46
+ };
You can’t perform that action at this time.
0 commit comments