BOJ 16916 부분 문자열

안예진·2021년 6월 3일
0

BOJ

목록 보기
7/8

https://www.acmicpc.net/problem/16916

KMP 알고리즘 사용해서 풀이하였다.
KMP 알고리즘이 궁금하다면?

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main_16916 {

	private static char[] s;
	private static char[] p;
	private static int[] fail;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		s = br.readLine().toCharArray();
		p = br.readLine().toCharArray();
		
		createFail();
		System.out.println(isSubStr());

	}
	// 부분 문자열인지 확인 함수
	private static int isSubStr() {
		int j = 0;
		int len = 0;
		for (int i = 0; i < s.length;) {
			if(len == p.length) break;
			if(s[i]==p[j]) { // 일치한다면
				len++;
				i++;
				j++;
			}else if(j==0) { // 돌아갈 곳이 없다면
				i++;
				len = 0;
			}else{ // 돌아가기
				j = fail[j-1];
				len = j;
			}
		}
		return len==p.length? 1: 0;
	}
	
	// 실패 함수 만들기
	private static void createFail() {
		fail = new int[p.length];
		int j =  0;
		for (int i = 1; i < p.length;) {
			if(p[i]==p[j]) { //일치한다면
				fail[i++] = j+1;
				j++;
			}else if(j==0) { // 돌아갈 곳이 없다면
				fail[i++] = 0;
			}
			else { //돌아가기
				j = fail[j-1];
			}
		}
	}
	

}
profile
에국은 에구구구...

0개의 댓글

관련 채용 정보