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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix