[Baekjoon] 16916번 : 부분 문자열
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 문제풀이
댓글남기기