/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
// naive string search
for(let i = 0; i < haystack.length; i++){
let count = 0;
for(let j = i; j < i + needle.length; j++){
if(haystack[j] === needle[count]){
count++;
}
}
if(count === needle.length){
return i;
}
}
return -1;
};
haystack의 문자열을 순회하면서, needle 문자열이 처음으로 등장하는 부분의 가장 첫 인덱스를 반환하는 것이 목표이다.
count를 사용해서 needle 문자열 충족될 때마다 증가시키면,
모든 needle 문자열이 연속으로 나왔을 때 count가 needle.length와 같아진다.
이 때의 i가 needle이 시작하는 가장 첫 인덱스 이므로 이를 반환한다.
만약 반복문이 끝날 때까지 아무런 반환도 발생하지 않는다면 needle이 없는 것이므로 -1을 반환한다.
대표적인 Naive String Search 문제라고 생각된다.
/**
* @param {string} haystack
* @param {string} needle
* @return {number}
*/
var strStr = function(haystack, needle) {
for(let i = 0; i < haystack.length; i++){
for(let j = 0; j < needle.length; j++){
if(haystack[i + j] !== needle[j]){
break;
}
if(j === needle.length - 1){
return i;
}
}
}
return -1;
};
코드를 약간 수정해서 count 없이도 작동하도록 만들었다.
결국 needle을 모두 만족해야 정답 처리를 할 수 있는 것이므로
한번이라도 만족하지 못하면 break 처리를 하고,
전부 통과하면 i를 반환한다.
var strStr = function(haystack, needle) {
if(!needle.length) return 0;
if(!haystack.includes(needle)) return -1;
return haystack.split(`${needle}`)[0].length;
};
재밌는 풀이가 있어서 가져와봤다.
includes()를 사용하는 것까지는 필자도 생각했던 부분인데, 마지막 코드가 참신했다.
needle로 split()한 배열에서 가장 첫 번째 원소의 길이가
needle이 시작하는 가장 첫 인덱스이므로, 이를 반환하는 것이다.
내장 메서드를 잘 활용했다고 생각된다.