1 분 소요

1. 문제

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

  • 문자열 문제
// 문제
문자열 S의 부분 문자열이란, 문자열의 연속된 일부를 의미한다.
예를 들어, "aek", "joo", "ekj" "baekjoon" 부분 문자열이고, 
"bak", "p", "oone" 부분 문자열이 아니다.

문자열 S와 P가 주어졌을 , P가 S의 부분 문자열인지 아닌지 알아보자.

// 입력
첫째 줄에 문자열 S, 둘째 줄에 문자열 P가 주어진다. 
 문자열은  문자열이 아니며, 길이는 100만을 넘지 않는다. 
, 알파벳 소문자로만 이루어져 있다.

// 출력
P가 S의 부분 문자열이면 1, 아니면 0 출력한다.

// 예제 입력 1 
baekjoon
aek

// 예제 출력 1 
1

// 예제 입력 2 
baekjoon
bak

// 예제 출력 2 
0

// 예제 입력 3 
baekjoon
joo

// 예제 출력 3 
1

// 예제 입력 4 
baekjoon
oone

// 예제 출력 4 
0

// 예제 입력 5 
baekjoon
online

// 예제 출력 5 
0

// 예제 입력 6 
baekjoon
baekjoon

// 예제 출력 6 
1


2. 핵심 아이디어

  • KMP 알고리즘 사용


3. Python 문제풀이

import sys
input = sys.stdin.readline

def make_table(p) :
  length = len(p)
  table = [0] * length
  j = 0

  for i in range(1, length) :
    while j > 0 and p[i] != p[j] :
      j = table[j-1]
        
    if p[i] == p[j] :
      j += 1
      table[i] = j

  return table


def kmp(parent, p) :
  table = make_table(p)
  parent_length = len(parent)
  pl = len(p)

  j = 0
  for i in range(parent_length) :
    while j > 0 and parent[i] != p[j] :
      j = table[j - 1]

    if parent[i] == p[j] :
      if j == pl - 1 :
        return 1
      else:
        j += 1

  return 0

parent = input().rstrip()
p = input().rstrip()
print(kmp(parent, p))


4. Java 문제풀이


댓글남기기