Skip to content

Commit c975b42

Browse files
committed
kmp
1 parent 77f2a26 commit c975b42

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,14 @@
1-
# Python 알고리즘 구현체 모음
1+
# Python 알고리즘 구현체
2+
3+
블로그, 페이스북 페이지, 책에 작성용으로 만드는 **Python 알고리즘 구현체**입니다.
4+
5+
알고리즘문제 해결사이트에서 대표적인 알고리즘 문제를 위주로 알고리즘을 정리할 예정입니다.
6+
7+
## Math
8+
9+
## Graph
10+
11+
## String
12+
13+
- [KMP](/string/kmp.py)
14+
- [BOJ 1768 : 찾기](https://www.acmicpc.net/problem/1786)

string/kmp.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [BOJ 1768] 찾기
2+
# link : https://www.acmicpc.net/problem/1786
3+
# tag : string, kmp, failure
4+
# @subinium
5+
6+
# Failure function
7+
def failure(P):
8+
pl = len(P)
9+
fail, j = [0 for _ in range(pl)], 0
10+
for i in range(1, pl):
11+
while j > 0 and P[i] != P[j] : j = fail[j-1]
12+
if P[i]==P[j]: fail[i], j = j+1, j+1
13+
return fail
14+
15+
# KMP Algorithm
16+
# time complexity : O(len(T) + len(P))
17+
def kmp(T, P):
18+
fail = failure(P)
19+
fail, res, j, tl, pl = failure(P), [], 0, len(T), len(P)
20+
for i in range(tl):
21+
while j > 0 and T[i] != P[j]: j = fail[j-1]
22+
if T[i]==P[j]:
23+
if j == pl-1:
24+
res.append(i-pl+2)
25+
j = fail[j]
26+
else : j+=1
27+
return res
28+
29+
# Main
30+
if __name__ == '__main__':
31+
T, P = input(), input()
32+
result = kmp(T, P)
33+
print(len(result))
34+
for idx in result: print(idx)

0 commit comments

Comments
 (0)