(Leetcode) 문자열에서 처음 나타나는 인덱스 찾기

28. 문자열에서 처음 나타나는 인덱스 찾기

두 개의 문자열 haystack과 needle에 대해 haystack에서 needle이 처음 나타나는 인덱스를 반환하거나, needle이 haystack의 일부가 아닌 경우 -1을 반환합니다.

예 1:
입력: haystack=”sadbutsad”, needle=”sad”
출력: 0
설명: “sad”는 인덱스 0과 6에서 발생합니다.
첫 번째는 인덱스 0에서 발생하므로 0을 반환합니다.

예 2:
입력: haystack=”leetcode”, needle=”leeto”
출력: -1
설명: “leeto”가 “leetcode”에 없기 때문에 -1을 반환합니다.

문제를 해결하다

1. 건초더미와 바늘, 두 개의 끈으로 건초더미에서 바늘이 돌아옵니다.
문제는 첫 번째 발생의 인덱스를 반환하는 것입니다. \*건초 더미에 바늘이 없으면 -1이 반환됩니다.

사고 방식

1. 먼저 바늘이 빈 문자열인지 확인합니다. 비어 있으면 0을 반환합니다.
2. 건초더미 줄을 통과하여 다음 단계를 완료합니다.
A. needle의 첫 번째 문자가 현재 인덱스에서 haystack의 하위 문자열과 일치하는지 확인합니다.
B. 첫 번째 문자가 일치하면 찾은 변수에 true를 삽입합니다. 두 번째 루프로 이어지는 문자도 일치하는지 확인합니다. 일치하지 않는 문자열이 발견되면 발견된 변수가 false로 설정됩니다.
C. 모든 문자가 일치하면 현재 색인이 반환됩니다.
3. 모든 인덱스를 순회한 후 일치하는 하위 문자열이 없으면 -1이 반환됩니다.

코드 작성

function strStr(haystack, needle) {
//needle 문자열이 비어있을경우 0 리턴
  if(needle.length === 0) {
    return 0;
  }

  for(let i = 0; i <= haystack.length - needle.length; i++) {
    if(haystack(i) === needle(0)) {
      let found = true; 

      for(let j = 1; j < needle.length; j++) {
      //needle의 두번째 문자열부터 마지막문자열까지 돌면서 판별
        if(haystack(i + j) !== needle(j)) {
          found = false;
          break;
        }
      }
 //found가 true면 문자열이 일치하는 것이므로 i를 리턴
      if(found) {
        return i;
      }
    }
  }
  return -1; //for문을 다 돌았는데도 일치하는 문자열이 없으면 -1을 리턴
}

let haystack = "leetcode",
    needle = "leeto";
    
 console.log(strStr(haystack, needle));

찾은 변수가 첫 번째 for에서 선언된 이유는 무엇입니까?

첫 번째 for 문 내에서 haystack(i) === needle(0) 조건이 충족되면 찾은 변수가 true로 설정되고,

두 번째 for 문을 입력합니다. 두 번째 for 문에서 바늘의 다른 모든 문자가 일치하는지 확인합니다.

일치하는 항목이 없으면 found가 false로 설정되고 두 번째 for 문이 종료됩니다.

첫 번째 for 문이 계속되면서 발견된 변수는 다음 인덱스에서 true로 다시 초기화되고 같은 과정이 반복된다.

이러한 방식으로 각 인덱스에 대해 정확히 일치하는 문자열을 결정할 수 있습니다.