알고리즘 문제/백준

[C++] 찾기(KMP) - 1786

우대비 2023. 1. 4. 10:24
반응형
 

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