코드
import java.io.*;
import java.util.*;
public class Main {
static int[] arr;
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
String b = br.readLine();
KMP(a,b);
System.out.println(0);
}
static void KMP(String parent, String pattern) {
int[] table = makeTable(pattern);
int n1 = parent.length();
int n2 = pattern.length();
int idx = 0; // 현재 대응되는 글자 수
for(int i=0; i< n1; i++) {
// idx번 글자와 짚더미의 해당 글자가 불일치할 경우,
// 현재 대응된 글자의 수를 table[idx-1]번으로 줄인다.
while(idx>0 && parent.charAt(i) != pattern.charAt(idx)) {
idx = table[idx-1];
}
// 글자가 대응될 경우
if(parent.charAt(i) == pattern.charAt(idx)) {
if(idx == n2-1) {
System.out.println(1);
System.exit(0);
idx =table[idx];
}else {
idx += 1;
}
}
}
}
static int[] makeTable(String pattern) {
int n = pattern.length();
int[] table = new int[n];
int idx=0;
for(int i=1; i<n; i++) {
// 일치하는 문자가 발생했을 때(idx>0), 연속적으로 더 일치하지 않으면 idx = table[idx-1]로 돌려준다.
while(idx>0 && pattern.charAt(i) != pattern.charAt(idx)) {
idx = table[idx-1];
}
if(pattern.charAt(i) == pattern.charAt(idx)) {
idx += 1;
table[i] = idx;
}
}
return table;
}
}
아직 완전히 이해한건 아니다..
'알고리즘' 카테고리의 다른 글
minimax 알고리즘 (0) | 2023.08.15 |
---|---|
파라메트릭 서치 (BOJ 1477) (0) | 2023.08.13 |
위상정렬(topology) 알고리즘 (0) | 2022.08.29 |
다익스트라(dijkstra) 알고리즘 (0) | 2022.08.29 |
프림(Prim) 알고리즘 (0) | 2022.08.28 |