반응형
#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 |