Computer Science/자료구조

[5.29] 07-2 KMP법 Knuth Morris Pratt

토마토. 2021. 5. 29. 13:13

KMP법 알아보기

브루트 포스법보다 효율적이다. 

검사했던 결과를 버리지 않고 활용하기 때문이다. 

'몇 번째 문자부터 다시 검색할 것인지'를 표로 만들어 문제를 해결한다. 

KMP법에서 사용하는 표 만들기 skip table

#KMP법으로 문자열 검색하기

def kmp_match(txt:str, pat:str) -> int:
  pt = 1
  pp = 0
  skip = [0] * (len(pat)+1)

  skip[pt] = 0
  while pt != len(pat):
    if pat[pt] == pat[pp]:
      pt += 1
      pp += 1
      skip[pt] = pp
    elif pp == 0:
      pt += 1
      skip[pt] = pp
    else:
      pp = skip[pp]
  
  pt = pp = 0
  while pt != len(txt) and pp != len(pat):
    if txt[pt] == pat[pp]:
      pt += 1
      pp += 1
    elif pp == 0:
      pt += 1
    else:
      pp = skip[pp]
  return pt - pp if pp == len(pat) else -1

if __name__ == '__main__':
  s1 = input('텍스트를 입력하세요 : ')
  s2 = input('패턴을 입력하세요 : ')

  idx = kmp_match(s1, s2)

  if idx == -1:
    print('패턴이 존재하지 않음')
  else:
    print(f'{(idx+1)}번째 문자가 일치합니다.')

 

'Computer Science > 자료구조' 카테고리의 다른 글

[5.30] 08-1 연결 리스트  (0) 2021.05.30
[5.29] 07-3 보이어, 무어법 Boyer-Moor method  (0) 2021.05.29
[5.29] 07-1 브루트 포스법  (0) 2021.05.29
[5.27] 06-9 도수 정렬  (0) 2021.05.27
[5.27] 06-8 힙 정렬  (0) 2021.05.27