두 문자열 needle
과 haystack
이 주어질때, haystack
에서 needle
이 처음으로 등장하는 인덱스를 리턴하라. 등장하지 않으면 -1를 리턴하라.
Input: haystack = "sadbutsad", needle = "sad"
Output: 0
Explanation: "sad" occurs at index 0 and 6.
The first occurrence is at index 0, so we return 0.
Input: haystack = "leetcode", needle = "leeto"
Output: -1
Explanation: "leeto" did not occur in "leetcode", so we return -1.
var strStr = function(haystack, needle) {
for(let i=0; i<haystack.length; i++) {
if(haystack[i] === needle[0]) {
for(let j=0; j<needle.length; j++) {
if(haystack[i+j] !== needle[j]) {
break;
} else if(j === needle.length - 1) {
return i;
}
}
}
}
return -1;
};
indexOf 메소드를 사용하면 간단하고 쉽게 한 줄로 해결되지만 문제의 태그 중에 Two Pointers가 있어 빌트인 메소드를 사용하지 않고 풀어보았다.
i
포인터는needle
의 첫 글자와 비교하기 위해haystack
의 글자를 순서대로 가리키는 포인터이다.j
포인터는needle
의 남은 글자와 비교하기 위해needle
의 글자를 순서대로 가리키는 포인터이다.for문을 이용해
haystack
의 글자 하나하나를needle
의 첫 글자와 비교한다.
일치할 경우, 다시 for문을 이용해needle
의 남은 글자와haystack
의 다음 글자를 비교한다.
여기서 불일치할 경우, 그 즉시 break문을 사용해 for문을 탈출한다. 그 뒤의 글자는 비교할 필요가 없기 때문이다.
모두 일치할 경우j
의 값과needle
의 길이가 일치해지기 때문에i
를 리턴하면 된다.