record logo record

목차

1. 단순 문자열 매칭
2. KMP(Knuth-Morris-Pratt)

단순 문자열 매칭 알고리즘 이란?

단순 문자열 매칭 알고리즘의 특징

단순 문자열 매칭 알고리즘 예시

  • 이러한 방식을 이용하면 O(N * M)의 시간 복잡도를 가진다.
#include <iostream>

using namespace std;

int findString(string parent, string pattern) {
	int parentSize = parent.size();
	int patternSize = pattern.size();
	for(int i = 0; i <= parentSize - patternSize; i++) {
		bool finded = true;
		for(int j = 0; j < patternSize; j++) {
			if(parent[i + j] != pattern[j]) {
				finded = false;
				break;
			}
		}
		if(finded) {
			return i;
		}
	}
	return -1;
}

int main(void) {
	string parent = "Hello World";
	string pattern = "llo W";
	int result = findString(parent, pattern);
	if(result == -1) {
		printf("not found");
	} else {
		printf("%d 번째에서 찾았습니다. ", result + 1);
	}
	return 0;
	
}

KMP(Knuth-Morris-Pratt) 이란?

KMP(Knuth-Morris-Pratt) 알고리즘의 특징

KMP(Knuth-Morris-Pratt) 알고리즘 예시

#include <iostream>
#include <vector>
using namespace std;

vector<int> makeTable(string pattern) {
	int patternSize = pattern.size();
	vector<int> table(patternSize, 0);
	int j = 0;
	for(int i = 1; i < patternSize; i++){
		while(j > 0 && pattern[i] != pattern[j]) {
			j = table[j - 1];
		}
		if(pattern[i] == pattern[j]) {
			table[i] = ++j;
		}
	}
	return table;
}

int main(void) {
	string pattern = "abacaaba";
	vector<int> table = makeTable(pattern);
	
	for(int i = 0; i < table.size(); i++){
		printf("%d ", table[i]);
	}
	return 0;
}

#include <iostream>
#include <vector>
using namespace std;

vector<int> makeTable(string pattern) {
	int patternSize = pattern.size();
	vector<int> table(patternSize, 0);
	int j = 0;
	for(int i = 1; i < patternSize; i++){
		while(j > 0 && pattern[i] != pattern[j]) {
			j = table[j - 1];
		}
		if(pattern[i] == pattern[j]) {
			table[i] = ++j;
		}
	}
	return table;
}

void KMP(string parent, string pattern) {
	vector<int> table = makeTable(pattern);
	int parentSize = parent.size();
	int patternSize = pattern.size();
	int j = 0;
	for(int i = 0; i < parentSize; i++) {
		while( j > 0 && parent[i] != pattern[j]) {
			j = table[j - 1];
		}
		if(parent[i] == pattern[j]) {
			if( j == patternSize - 1) {
				printf("%d번째에서 찾았습니다. \n", i - patternSize + 2);
				j = table[j];
			} else {
				j++;
			}
		}
	}
	
}

int main(void) {
	string parent = "ababacabacaabacaaba";
	string pattern = "abacaaba";
	KMP(parent, pattern);
	return 0;
}

관련된 Post

References