php網站開發(fā)作業(yè)企業(yè)網址怎么申請
題目鏈接: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" 中出現(xiàn),所以返回 -1 。
提示:
1 <= haystack.length, needle.length <= 104
haystack
?和?needle
?僅由小寫英文字符組成
文章講解:代碼隨想錄
視頻講解:幫你把KMP算法學個通透!(理論篇)
題解1:暴力法
思路:外層循環(huán)遍歷字符串,內層循環(huán)判斷是否匹配。
/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function(haystack, needle) {for (let i = 0; i < haystack.length - needle.length + 1; i++) {let j = i;let flag = true;for (let k = 0; k < needle.length; k++) {if (haystack[j++] !== needle[k]) {flag = false;break;}}if (flag) {return i;}}return -1;
};
分析:時間復雜度為 O(n2),空間復雜度為 O(1)。
題解2:KMP
思路:使用 KMP 算法來進行字符串模式匹配,也是這道題目的標解。先計算出 next 數組(即子串最長公共前后綴的前綴表),再借助 next 數組進行模式匹配。
/*** @param {string} haystack* @param {string} needle* @return {number}*/
var strStr = function(haystack, needle) {// 計算前綴表const next = [0];// i 為后綴末尾,j 為前綴末尾let j = 0;for (let i = 1; i < needle.length; i++) {while (j > 0 && needle[i] !== needle[j]) {j = next[j - 1];}if (needle[j] === needle[i]) {j++;}next[i] = j;}// 字符串模式匹配j = 0;for (let i = 0; i < haystack.length; i++) {while (j > 0 && haystack[i] !== needle[j]) {j = next[j - 1];}if (haystack[i] === needle[j]) {j++;}if (j === needle.length) {return i - needle.length + 1;}}return -1;
};
分析:設原字符串長度為 n,匹配的模式串長度為 m,時間復雜度為 O(n + m),空間復雜度為 O(m)。
收獲
學習了 KMD 算法,寫代碼還不熟練,需要多多練習。