[분류]

  • KMP
  • 문자열

[문제링크]

[요구사항]

  • 문자열 S에 대해 부분문자열 P가 포함되어있는지 여부를 확인한다.

[풀이]

  1. KMP알고리즘의 전형적인 문제이다.

  2. 우선은 부분이 되는 문자열 P에 대해서 table을 구한다. 이 table은 prefix와 suffix가 얼마나 겹치는지 구한다.

  3. table을 기준으로 문자열 S에 대해서 P를 비교해 가면서 건너뛰면서 구한다.

  4. 결과를 출력한다.

[코드]

//BOJ_16916_부분문자열

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] S = br.readLine().toCharArray();
        char[] P = br.readLine().toCharArray();

        KMP(S, P);
    }

    public static int[] getTable(char[] P){
        int table[] = new int[P.length+1];
        int j=0;

        for(int i=1;i<P.length;i++){
            while(j>0 && P[i]!=P[j]){
                j = table[j-1];
            }
            if(P[i]==P[j]) table[i] = ++j;
        }
        return table;
    }

    public static void KMP(char[] S, char[] P){
        int table[] = getTable(P);
        int j=0;
        for(int i=0;i<S.length;i++){
            while(j>0 && S[i]!=P[j]){
                j = table[j-1];
            }
            if(S[i]==P[j]){
                if(j==P.length-1){
                    System.out.println(1);
                    return;
                }else{
                    j++;
                }
            }
        }
        System.out.println(0);
    }
}



[통과여부]

image

[느낀점]

KMP 알고리즘을 처음 알아서 너무 어려웠고 솔직히 아직 잘 이해가 안간다..