본문 바로가기

알고리즘문제풀이

KMP알고리즘-문자열 찾기

반응형
#include<iostream>
using namespace std;
//해당 문자열 인덱스 찾기 

char arr[20];
char Find[10];
int ans[20]; //같은 문자열의 최초 인덱스 넣을 곳 
int cnt = 0;
int pi[20];
void FalseFunction(int len) // 패턴 찾기 
{
	pi[0] = -1;
	pi[1] = 0; //초기화 테이블 
	int i= 0;
	int j = 1;
    while (j <len)
	{
		if (Find[i] == Find[j])
		{
			pi[j] = pi[j - 1] + 1;
			i++;
			j++;
		}
		else
		{
			pi[j] = 0;
			j++;
			i = 0;
		}
	}
	/*	for (int i = 0; i < 9; i++) //테이블확인
	{
		cout << pi[i] << " ";
	}*/
}
void search(int Alen,int Blen)
{
	int acur= 0;
	int bcur=0;
	while (acur<Alen)
	{
		if (arr[acur] == Find[bcur])
		{
			if (bcur == Blen - 1)
			{
				ans[cnt] = acur - bcur + 1;
				cnt++;
			}
			acur++;
			bcur++;
		}
		else
		{
			acur = acur - pi[bcur];
			bcur = 0;
		}
	}
}
int main()
{
	cin.getline(arr,20);
	cin.getline(Find, 10); //찾을문자열 
	int len = 0;
	while (Find[++len] != 0);
	FalseFunction(len);
	int len2 = 0;
	while (arr[++len2] != 0);
	search(len2, len);
	
	//정답출력
	for (int i = 0; i < cnt; i++)
		cout << ans[i] << endl;
}

많은 문자열중에서 원하는 문자열를을 빠르게 구하는 방법은 kmp알고리즘을 이용하는 것이다

시간복잡도 O(N+M)

 

 

반응형

'알고리즘문제풀이' 카테고리의 다른 글

[백준11438 ]LCA2  (0) 2019.10.11
[백준1158]조세퍼스문제 -연결리스트로 구현해보기  (0) 2019.10.07
next_permutation STL 구현  (1) 2019.09.30
[백준 2252]줄세우기  (0) 2019.04.25
위상정렬  (0) 2019.04.08