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

给你两个字符串 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 };
复制代码

 

posted @   icyyyy  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示