반응형
KMP 알고리즘
보통 문자열 안에서 패턴을 찾는 알고리즘을 만들때 가장 쉽게 생각해볼 수 있는 것은 문자 하나하나마다 패턴과 일치하는지 체크하는 방법일겁니다. 그런데 위 방법은 당연하게도 시간 복잡도
flrjtwjrjt.tistory.com
위 문제는 KMP 알고리즘에서
pattern table 만드는 것만 알면 풀 수 있는 아주 간단한 문제 입니다.
두번 이상 검색되는 패턴중에 가장 긴 패턴의 길이를 구하는 것인데
pattern table 생성하는 과정에서 가장긴 접미사를 가진 애만 찾으면 해결되는 문제입니다.
int KMP(string str)
{
vector<int> table(str.size());
for (int head = 0, tail = 1; tail < str.size(); tail++)
{
while (head > 0 && str[head] != str[tail])
head = table[head - 1];
if (str[head] == str[tail])
table[tail] = ++head;
}
int MAX = 0;
for (int i = 0; i < str.size(); i++)
if (MAX < table[i]) MAX = table[i];
return MAX; // 테이블에 저장된 값 중에서 가장 큰 값을 리턴
}
int main()
{
string str;
cin >> str;
int MAX = 0;
for (int i = 0; i < str.size(); i++)
{
// 맨 앞의 문자 하나씩 때어서
// 여러 경우에서의 패턴 테이블을 만듬
int n = KMP(str.substr(i, str.size() - i));
if (MAX < n) MAX = n;
}
cout << MAX;
return 0;
}
반응형
LIST
'알고리즘 문제 > 백준' 카테고리의 다른 글
[C++] 광고(KMP) - 1305 (0) | 2023.01.04 |
---|---|
[C++] 찾기(KMP) - 1786 (0) | 2023.01.04 |
[C++] 거의 최단 경로(Dijkstra) - 5719 (1) | 2023.01.01 |
[C++] 파티(Dijkstra) - 1238 (1) | 2022.12.22 |
[C++] 가운데를 말해요 - 1655 (2) | 2022.12.10 |