백준
찾기 - KMP 알고리즘
연구하는개발자
2021. 4. 2. 04:17
728x90
<참고>
www.youtube.com/watch?v=UcjK_k5PLHI
백준 1786 : 찾기 (JAVA) KMP알고리즘
해당 문제는 https://www.acmicpc.net/problem/1786 를 참고하시기 바랍니다!간단하게 문제를 요약하면 K...
blog.naver.com
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m
www.acmicpc.net
package String;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
// 백준 찾기
public class Find {
public static int[] getPi(String pattern){ //패턴 찾기
int len = pattern.length();
int []pi = new int[len];
int j=0;
for(int i=1; i<len; i++){
while(j>0 && pattern.charAt(i)!= pattern.charAt(j)){
j = pi[j-1];
}
if(pattern.charAt(i)==pattern.charAt(j)){
pi[i]=++j;
}
}
return pi;
}
public static ArrayList<Integer>KMP(String str, String pattern){
ArrayList<Integer> list = new ArrayList<>();
int [] pi = getPi(pattern);
int len = str.length();
int plen = pattern.length();
int j =0;
for(int i=0; i<len; i++){
while(j>0 && str.charAt(i)!=pattern.charAt(j)) {
j = pi[j - 1];
}
if(str.charAt(i)==pattern.charAt(j)){
if(j==plen-1){
list.add(i-plen+1);
j = pi[j];
}else{
j++;
}
}
}
return list;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String target = br.readLine();
String tofind = br.readLine();
ArrayList<Integer> list = KMP(target, tofind); //KMP 함수의 반환값 저장
int size = list.size(); // 찾은 패턴이 몇개인지 저장할 변수
System.out.println(size); // 찾은 패턴의 개수 출력
for(int i=0; i<size; i++) { // List의 size만큼 해당 인덱스를 출력한다
System.out.print(list.get(i)+1+" ");
}
}
}