Notice
Recent Posts
Recent Comments
Link
할껀하고놀자
[알고리즘] KMP 알고리즘 O(N+M) 본문
728x90
- 문자열 검색 알고리즘. for문 한번만 돌기 때문에 좋다.
#include<iostream>
#include<vector>
using namespace std;
vector<int> makeTable(string pattern) {
int j = 0;
int patternSize = pattern.size();
vector<int> table(patternSize, 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 j = 0;
int parentSize = parent.size();
int patternSize = pattern.size();
for (int i = 1; i < parentSize; i++) {
while (j > 0 && parent[i] != pattern[j]) {
j = table[j - 1];
}
if (parent[i] == pattern[j]) {
if (j == patternSize - 1) {
cout << i - patternSize + 2 << " 번째에서 발견!" << endl;
j = table[j];
}
else {
j++;
}
}
}
}
int main() {
string parent = "abaabaaaabaabcca";
string pattern = "aaab";
KMP(parent, pattern);
return 0;
}
'[IT] > 알고리즘' 카테고리의 다른 글
[알고리즘] 버블정렬 (0) | 2019.12.18 |
---|---|
[알고리즘] 선택정렬 (0) | 2019.12.18 |
[알고리즘] C++ split() 하는 초간단한 방법 (0) | 2019.06.07 |
[알고리즘] 그리디 알고리즘 기초(C++) (0) | 2019.05.31 |
[알고리즘] 간단한 크루스칼 알고리즘 구현(C++) (0) | 2019.05.31 |
Comments