티스토리 뷰
16916번: 부분 문자열
첫째 줄에 문자열 S, 둘째 줄에 문자열 P가 주어진다. 두 문자열은 빈 문자열이 아니며, 길이는 100만을 넘지 않는다. 또, 알파벳 소문자로만 이루어져 있다.
www.acmicpc.net
문제
문자열 S의 부분 문자열이란, 문자열의 연속된 일부를 의미한다.
예를 들어, "aek", "joo", "ekj"는 "baekjoon"의 부분 문자열이고, "bak", "p", "oone"는 부분 문자열이 아니다.
문자열 S와 P가 주어졌을 때, P가 S의 부분 문자열인지 아닌지 알아보자.
입력
첫째 줄에 문자열 S, 둘째 줄에 문자열 P가 주어진다. 두 문자열은 빈 문자열이 아니며, 길이는 100만을 넘지 않는다. 또, 알파벳 소문자로만 이루어져 있다.
출력
P가 S의 부분 문자열이면 1, 아니면 0을 출력한다.
풀이
KMP알고리즘을 사용하여 풀 수 있다.
동빈나 님의 KMP 문자열 매칭 알고리즘 영상을 참고하였다.
www.youtube.com/watch?v=yWWbLrV4PZ8&t=366s
내 것으로 만드려면 반복 학습이 필요할 것 같다.
어렵다..
def make_table(pattern):
length = len(pattern)
table = [0] * length
j = 0
for i in range(1, length):
while j > 0 and pattern[i] != pattern[j]:
j = table[j - 1]
if pattern[i] == pattern[j]:
j += 1
table[i] = j
return table
def kmp(parent, pattern):
table = make_table(pattern)
parent_length = len(parent)
pattern_length = len(pattern)
j = 0
for i in range(parent_length):
while j > 0 and parent[i] != pattern[j]:
j = table[j - 1]
if parent[i] == pattern[j]:
if j == pattern_length - 1:
return 1
else:
j += 1
return 0
parent = input()
pattern = input()
print(kmp(parent, pattern))
'PS > BOJ' 카테고리의 다른 글
[Python] [백준] 1647번: 도시 분할 계획 (0) | 2021.03.07 |
---|---|
[Python] [백준] 11657번: 타임머신 (0) | 2021.03.07 |
[Python] [백준] 11438번: LCA 2 (0) | 2021.03.05 |
[Python] [백준] 11437번: LCA (0) | 2021.03.05 |
[Python] [백준] 1922번: 네트워크 연결 (0) | 2021.03.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 고차함수
- javascript
- heapq
- webpack
- 웹팩
- 백준
- springboot
- html
- 에라토스테네스의체
- BOJ
- Java
- controller
- 1급객체
- 투포인터
- 파이썬
- 다익스트라
- BFS
- python
- 최소공통조상
- 자바스크립트
- 플로이드워셜
- js
- 인프런
- 알고리즘
- 최소스패닝트리
- CSS
- frontend
- 위상정렬
- SCSS
- MST
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함