给你两个字符串 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