Featured image of post Find the Index of the First Occurrence in a String

Find the Index of the First Occurrence in a String

28. Find the Index of the First Occurrence in a String

分析

  1. 在源传和目标串首部添加一个字符,使得下标匹配从1开始,方便处理。
  2. 构建目标串的 next 数组。具体来说,对于目标串的任意位置 i,我们要找到一个数 j,使得 needle[1:j] 和 needle[i-j+1:i] 是相等的,并且 j 的值尽可能大。每个 next[i] 对应一个 j 。
  3. 遍历源串,在匹配过程中,若 haystack[i] 与 needle[j+1] 不相等,则将 j 回溯到 next[j]。若相等,则同时向后移动 i 和 j。若 j 移动到 needle 的末尾,则表示在 haystack 中找到了 needle,返回 i - m 即可。
  4. 时间复杂度为 O(n+m),其中 n 和 m 分别是 haystack 和 needle 的长度。

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
    int strStr(string haystack, string needle) {
        if (needle.empty()) return 0;
        int n = haystack.size(), m = needle.size();
        haystack = ' ' + haystack, needle = ' ' + needle;
        vector<int> next(m + 1);
        for (int i = 2, j = 0; i <= m; i ++ ) {
            while (j && needle[i] != needle[j + 1]) j = next[j];
            if (needle[i] == needle[j + 1]) j ++ ;
            next[i] = j;
        }
        
        for (int i = 1, j = 0; i <= n; i ++ ) {
            while (j && haystack[i] != needle[j + 1]) j = next[j];
            if (haystack[i] == needle[j + 1]) j ++ ;
            if (j == m) return i - m;
        }

        return -1;
    }
};
Built with Hugo
Theme Stack designed by Jimmy