首页 > 其他分享 >28.找出字符串中第一个匹配项的下标

28.找出字符串中第一个匹配项的下标

时间:2022-11-02 14:36:22浏览次数:43  
标签:下标 复杂度 needle 28 param 字符串 return haystack

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
提示:

1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成

方法一:暴力解法

时间复杂度:O(mxn)

空间复杂度:O(1)

 1 /**
 2  * @param {string} haystack
 3  * @param {string} needle
 4  * @return {number}
 5  */
 6 var strStr = function(haystack, needle) {
 7     const n = haystack.length,
 8         m = needle.length;
 9     for (let i = 0; i + m <= n; i++) {
10         let flag = true;
11         for (let j = 0; j < m; j++) {
12             if (haystack[i + j] !== needle[j]) {
13                 flag = false;
14                 break;
15             }
16         }
17         if (flag) {
18             return i;
19         }
20     }
21     return -1;
22 };

方法二:Knuth-Morris-Pratt算法

时间复杂度:O(n+m)

空间复杂度:O(m)

 

 1 /**
 2  * @param {string} haystack
 3  * @param {string} needle
 4  * @return {number}
 5  */
 6 var strStr = function(haystack, needle) {
 7     const n = haystack.length,
 8         m = needle.length;
 9     if (m === 0) {
10         return 0;
11     }
12     const pi = new Array(m).fill(0);
13     for (let i = 1, j = 0; i < m; i++) {
14         while (j > 0 && needle[i] !== needle[j]) {
15             j = pi[j - 1];
16         }
17         if (needle[i] === needle[j]) {
18             j++;
19         }
20         pi[i] = j;
21     }
22     for (let i = 0, j = 0; i < n; i++) {
23         while (j > 0 && haystack[i] !== needle[j]) {
24             j = pi[j - 1];
25         }
26         if (haystack[i] === needle[j]) {
27             j++;
28         }
29         if (j === m) {
30             return i - m + 1;
31         }
32     }
33     return -1;
34 };

 

标签:下标,复杂度,needle,28,param,字符串,return,haystack
From: https://www.cnblogs.com/icyyyy/p/16850904.html

相关文章