반응형
2021.03.02 | 2021.03.09 | |
답지 봄(kks 블로그 참고) |
구현할 용기가 없어 코드만 베껴봄... |
대표적인 kmp 문제. 핵심 아이디어는 찾는 문자열의 j 를 저장한다는 개념과 fail 함수 개념이 중요하다.
꼭 다시 풀 문제.
문제
문자열 S의 부분 문자열이란, 문자열의 연속된 일부를 의미한다.
예를 들어, "aek", "joo", "ekj"는 "baekjoon"의 부분 문자열이고, "bak", "p", "oone"는 부분 문자열이 아니다.
문자열 S와 P가 주어졌을 때, P가 S의 부분 문자열인지 아닌지 알아보자.
입력
첫째 줄에 문자열 S, 둘째 줄에 문자열 P가 주어진다. 두 문자열은 빈 문자열이 아니며, 길이는 100만을 넘지 않는다. 또, 알파벳 소문자로만 이루어져 있다.
출력
P가 S의 부분 문자열이면 1, 아니면 0을 출력한다.
구현
import collections
import sys
sys.setrecursionlimit(10 ** 4)
input = sys.stdin.readline
#
# def print(a):
# sys.stdout.write(str(a))
# print = sys.stdout.write
def iinput(): return int(input())
def lisinput(): return list(map(int, input().split()))
def dq(a):
return collections.deque(a)
def minput(): return map(int, input().split())
def liinput(): return list(map(int, list(input().replace("\n", ""))))
def addNode(a, b):
return [a[0] + b[0], a[1] + b[1]]
def returnValue(graph, node):
return graph[node[0]][node[1]]
def transpose(graph):
return list(map(list, zip(*graph)))
def make_table():
length = len(p)
table = [0] * len(p)
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():
table = make_table()
j = 0
for i in range(len(s)):
while j > 0 and s[i] != p[j]:
j = table[j - 1]
if s[i] == p[j]:
if j == len(p) - 1:
return True
else:
j += 1
return False
if __name__ == '__main__':
s = input().replace('\n', '')
p = input().replace('\n', '')
print(1 if kmp() else 0)
반응형
'알고리즘' 카테고리의 다른 글
백준 17070번 파이프 옮기기 1 골드5 (0) | 2021.03.03 |
---|---|
백준 1197번 최소 스패닝 트리- 유니온 파인드 파이썬 골드4 (0) | 2021.03.02 |
백준 1922번 네트워크 연결 - 최소스패닝 트리 골드4 파이썬 (0) | 2021.02.27 |
백준 13397번 구간나누기2 - 골드4 파이썬 이분 탐색 (0) | 2021.02.27 |
아직 맞추지 못한 그리디 문제 1062번 가르침 (0) | 2021.02.26 |