LeetCode 28. Implement strStr()
題目
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
翻譯
實做strStr()。
給一個指針needle跟字串堆疊haystack,回傳指針第一次在堆疊中出現的位置index。
範例:
haystack = "abcdede"
needle = "de","de"第一次出現的位置為3
思路
- 這就是字串搜尋的功能,用api的話,只要用String的indexOf(x)就可以直接得到答案
- 再來是用截字串的方法,haystack(i,needle.length)如果跟needle相等,回傳i的位置即可
- 如果不用api的情況下,使用迴圈比對haystack跟needle
- haystack = "abcbb",needle = "bb" 為例
- 一開始 abcbb != bb 失敗 ; 往下比對abcbb != bb可是接下來 abcbb != bb 失敗
- 值到最後abcbb == bb比對成功,回傳haystack現在的位置3
- 以上寫法效率太差,實際上可以用KMP演算法來增加速度,不過KMP演算法我覺得超出easy的部分,這邊就先跳過不提
解題
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
return haystack.indexOf(needle);
}
截字串比對
var strStr = function(haystack, needle) {
if(!needle) return 0;
if(!haystack || needle.length > haystack.length) return -1;
var i,j;
for(i = 0 ; i < haystack.length ; i++){
var str = haystack.substr(i,needle.length);
if(str == needle){
return i;
}
}
return -1;
};
超出時間的解題
var strStr = function(haystack, needle) {
if(!needle) return 0;
if(!haystack || needle.length > haystack.length) return -1;
var i,j;
for(i = 0 ; i < haystack.length ; i++){
var index = i;
j = 0; //比對失敗,將haystack指針移向下一個字元,重新跟needle比對
while(haystack.charAt(index) == needle.charAt(j) ){
//比對needle跟haystack,比對成功回傳haystack開始比對的位置
if(j == needle.length -1){
return parseInt(i);
}
index++; j++;
}
}
return -1;
};