[javascript] 문자열 매칭 알고리즘
이번에는 JavaScript에서 문자열 매칭 알고리즘을 구현하는 방법에 대해 알아보겠습니다.
1. 단순한 방법
가장 단순한 문자열 매칭 알고리즘은 두 문자열을 한 문자씩 비교하는 방법입니다.
function simpleStringMatch(text, pattern) {
for (let i = 0; i <= text.length - pattern.length; i++) {
let j;
for (j = 0; j < pattern.length; j++) {
if (text[i + j] !== pattern[j]) break;
}
if (j === pattern.length) return i; // 매칭된 인덱스 반환
}
return -1; // 매칭 실패
}
하지만 이 방법은 문자열이 길어질수록 비효율적입니다.
2. KMP 알고리즘
KMP(Knuth-Morris-Pratt) 알고리즘은 문자열 매칭을 보다 효율적으로 수행하는 알고리즘입니다. 먼저 패턴에 대한 실패 함수를 계산한 다음, 이를 활용하여 텍스트 문자열을 한 번만 훑어 패턴 매칭을 수행합니다.
function computeLPSArray(pattern) {
let lps = Array(pattern.length).fill(0);
let len = 0;
let i = 1;
while (i < pattern.length) {
if (pattern[i] === pattern[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len !== 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
function KMPSearch(text, pattern) {
let M = pattern.length;
let N = text.length;
let lps = computeLPSArray(pattern);
let i = 0; // text 인덱스
let j = 0; // pattern 인덱스
while (i < N) {
if (pattern[j] === text[i]) {
i++;
j++;
}
if (j === M) {
return i - j; // 매칭된 인덱스 반환
j = lps[j - 1];
} else if (i < N && pattern[j] !== text[i]) {
if (j !== 0) j = lps[j - 1];
else i = i + 1;
}
}
return -1; // 매칭 실패
}
KMP 알고리즘은 패턴에 대한 실패 함수를 미리 계산하므로 효율적인 문자열 매칭을 수행할 수 있습니다.
JavaScript에서 문자열 매칭 알고리즘을 구현할 때는 매칭 속도 및 메모리 사용량에 유의해야 합니다.