함수 isSubsequence는 str1과 str2를 인수로 받습니다. str1의 문자 또는 문자열이 str2 문자열에 존재한다면 true를 반환하고 그렇지 않을경우 false를 반환합니다. 단, str1의 문자의 순서가 뒤바뀔 수는 없습니다.
str2 문자열을 순회하면서 str1이 가지고 있는 문자가 str2의 문자에 포함된다면 str1의 다음 문자와 비교하고 포함되지 않는 경우 현재 str1의 문자와 str2의 다음 문자와 비교합니다. 반복문을 순회하면서 str1의 인덱스를 나타내는 변수가 str1의 길이 즉 마지막에 도달했을 때 true를 반환합니다. 방식은 두가지로 반복문을 순회하거나 재귀를 이용하는 방법이 있습니다.
'use strict'
const isSubsequence = (str1, str2) => {
let i = 0;
let j = 0;
if (!str1) return true;
while (j < str2.length) {
if (str2[j] === str1[i]) i++;
if (i === str1.length) return true;
j++;
}
return false;
}
isSubsequence('hello', 'hello world')
; // true
isSubsequence('sing', 'string')
; // true
isSubsequence('abc', 'abracadabra')
; // true
isSubsequence('abc', 'acb')
; // false
i
와 변수 j
를 0으로 선언 및 초기화합니다. i는 str1
의 인덱스를 나타내고, j는 str2
의 인덱스를 나타냅니다.true
를 반환합니다.j
가 str2의 길이보다 작을 경우 계속해서 반복문을 순회합니다.str2[j]
와 str1[i]
의 값이 일치할 경우 i를 증가시킵니다.(str1의 문자가 str2에 모두 속할경우 최종적으로 위의 조건문을 통과하고 들어오기 때문에 i는 str1의 마지막 인덱스에서 1이 증가하므로 str1.length와 동일한 값을 가지게 됩니다.)
'use strict';
const isSubsequence = (str1, str2) => {
if (str1.length === 0) return true;
if (str2.length === 0) return false;
if (str2[0] === str1[0]) return isSubsequence(str1.slice(1), str2.slice(1));
return isSubsequence(str1, str2.slice(1));
}
isSubsequence('hello', 'hello world')
; // true
isSubsequence('sing', 'string')
; // true
isSubsequence('abc', 'abracadabra')
; // true
isSubsequence('abc', 'acb')
; // false
(str1과 str2가 일치할 경우 str1의 첫번째 요소를 제거합니다.)
(str1과 str2가 일치하지 않을 경우 계속해서 str2의 첫번째 요소를 제거합니다.)