# \#28 Implement strStr() 查找字串 ## *給定兩個string:haystack和needle, 回傳needle出現在haystack的位置index* ## Log - build 20210402 by syhuang ## KMP(字串查找演算法) - 建立字串查找表, 根據此表跑單層迴圈找字串出現位置, 時間複雜度降低至O(n) ```javascript= var strStr = function(haystack, needle) { var m = haystack.length, n = needle.length; if(!n) return 0; var lps = kmpProcess(needle); for(var i = 0, j = 0; i < m;) { if(haystack[i] == needle[j]) { i++, j++; } if(j == n) return i - j; if(i < m && haystack[i] != needle[j]) { if(j) j = lps[j - 1]; else i++; } } return -1; }; var kmpProcess = function(needle) { var n = needle.length; var lps = new Array(n).fill(0); for (var i = 1, length = 0; i < n;) { if(needle[i] === needle[length]) { length++; lps[i] = length; i++; } else if (length) length = lps[length - 1]; else { lps[i] = 0; i++; } } return lps; } ``` ## 語言專屬解法(其實很多語言都有查找字串方法了) - javascript已有String.indexOf()方法可用 ```javascript= var strStr = function(haystack, needle) { return haystack.indexOf(needle); }; ``` ## 初見 - 暴力破解:跑兩層for loop, 外層是haystack, 內層needle, 逐個比對字元, 時間複雜度是O(n^2) <br>當字元不相等 - 內層break <br>當內層比對到j==needle.length-1表示haystack存在needle這個字串,回傳i即可 ```javascript= var strStr = function(haystack, needle) { if(needle=='') return 0; if(haystack=='') return -1; if(haystack.length < needle.length) return -1; var find = false; for(var i=0; i<=haystack.length - needle.length ; i++){ for(j=0; j<needle.length; j++){ if(haystack.charAt(i+j)!=needle.charAt(j)) break; if(j==needle.length-1) return i; } } return -1; }; ``` ## 備註 ## 參考 [KMP實作by javascript來源](https://leetcode.com/problems/implement-strstr/discuss/13034/JavaScript-KMP-beats-95) ###### tags: `leetcode`, `leetcode-easy`