반응형
KMP 알고리즘
보통 문자열 안에서 패턴을 찾는 알고리즘을 만들때 가장 쉽게 생각해볼 수 있는 것은 문자 하나하나마다 패턴과 일치하는지 체크하는 방법일겁니다. 그런데 위 방법은 당연하게도 시간 복잡도
flrjtwjrjt.tistory.com
해당 문제는 KMP 알고리즘만 알고 있으면 아주 간단하게 해결할 수 있는 문제입니다.
vector<int> makeTable(string pattern)
{
vector<int> table(pattern.size(), 0);
int head = 0;
for (int tail = 1; tail < pattern.size(); tail++)
{
while (head > 0 && pattern[head] != pattern[tail])
head = table[head - 1];
if (pattern[head] == pattern[tail])
{
table[tail] = ++head;
}
}
return table;
}
table 생성 함수
void KMP(string str, string pattern)
{
vector<int> table = makeTable(pattern);
vector<int> N;
int P = 0;
for (int S = 0; S < str.size(); S++)
{
while (P > 0 && pattern[P] != str[S])
P = table[P - 1];
if (pattern[P] == str[S])
{
if (P == pattern.size() - 1)
{ // pattern의 시작 위치를 vector에 넣어줌
N.push_back(S - pattern.size() + 2);
P = table[P];
}
else
++P;
}
}
cout << N.size() << '\n';
for (int i = 0; i < N.size(); i++)
cout << N[i] << '\n';
}
KMP 함수
int main()
{
string str;
string pattern;
getline(cin, str);
getline(cin, pattern);
KMP(str, pattern);
return 0;
}
반응형
LIST
'알고리즘 문제 > 백준' 카테고리의 다른 글
[C++] 에라토스테네스의 체 - 2960 (0) | 2023.01.05 |
---|---|
[C++] 광고(KMP) - 1305 (0) | 2023.01.04 |
[C++] Cubeditor(KMP) - 1701 (0) | 2023.01.03 |
[C++] 거의 최단 경로(Dijkstra) - 5719 (1) | 2023.01.01 |
[C++] 파티(Dijkstra) - 1238 (1) | 2022.12.22 |