Python: Bruteforce, BoyreMoore Matching Algorithm

2020. 2. 19. 13:142020/Algorithm

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# _*_ coding=utf-8 _*_
#BruteForce String matching Algorithm
 
def bruteforce( pattern, text ):
 
    lengthOfPattern = len(pattern)
    lengthOfText = len(text)
 
    i = 0
    while i <= lengthOfText - lengthOfPattern:
 
        j = 0
        while j < lengthOfPattern:
            if text[i+j] != pattern[j]:
                break
            j = j + 1
        if j == lengthOfPattern:
            return 1
        
        i = i + 1
    return 0
 
 
#str_1 = input()
#str_2 = input()
#res = bruteforce( str_1, str_2)
 
########## BoyreMoore ###############
# 찾는 문자열의 요소에 따라 스킵할 칸 수를 조정한다.
# 문자열에서 패턴과 일치하지 않는 문자열을 발견한 경우 해당 문자에 따라서
# 이동할 칸수를 결정하기 위해 테이블을 생성한다. (파이썬의 경우 딕셔너리 활용)
def makebmt(pattern):
    lengthOfPattern = len(pattern)
    mydict = {}
    for x in range(len(pattern)):
        index = pattern[x]
# 무조건 옆으로 한 칸 이동해야하기 떄문에 1보다 작아서는 안된다
        value = max(1,lengthOfPattern-1-x)
        mydict[index] = value
        
    return mydict
# pattern= 'test' => mydict = { 'e':2, 's':1, 't':1 } (중복문자는초기화됨)
 
def boymoreMatching(pattern, mydict, text):
 
    lengthOfPattern = len(pattern)
    lengthOfText = len(text)
    mydict = mydict
    i = 0
    while i <= lengthOfText - lengthOfPattern: # 검색할 문자 시작점 지정
 
        numOfSkip = 0
        j = lengthOfPattern-1 #패턴의 뒤부터 검색
        while j >= 0:
            if text[i+j] != pattern[j]: # 패턴이 일치하지 않는 경우
                if text[i+j] in mydict.keys(): # 문자열의 문자가 딕셔너리에 있는지 확인
                    numOfSkip = mydict[ text[i+j] ]
                    break
                else: # 딕셔너리에 해당 문자 없음 -> 비교할 가치 없음
                    numOfSkip = len(pattern) # 따라서 문자길이만큼 이동
                    break
            j = j - 1
        if numOfSkip == 0: # 패턴의 모든 값이 일치한다.
            return 1
        
        i = i + numOfSkip
        
    return 0
 
mydict = makebmt('test')
print(boymoreMatching('test',mydict,'asdasdtest'))
print(boymoreMatching('test',mydict,'text'))
 
 
##############출력
1
0
 
 
 
    
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
 

'2020 > Algorithm' 카테고리의 다른 글

Python: 기초 문법  (0) 2020.02.15
Python: 선택 정렬, 삽입 정렬, 버블정렬, 병합정렬  (0) 2020.02.15
Python: Binary Search (이진탐색)  (0) 2020.02.15