본문 바로가기
알고리즘

KMP의 일부, computeLPS에 대해서 (KMP)

by dharana7723 2021. 6. 19.

생각보다 굉장히 쉽다. kmp가 복잡하고 이름이 복잡해보여서 그렇지 기본 틀은 간단하다.

lps는 s라는 문자열이 있을때 각 1개의 문자열에서 순서대로 len(s)까지의 길이를 지나는 동안 각 크기의 문자열에 대해 최대 있을 수 있는 가장 긴 prefix와 suffix가 겹치는 길이를 저장한다.

 

예를 들어 ABCA라는 문자열이 있으면 A, AB,ABC,ABCA라는 문자열을 도는 동안 leng은 0부터 시작해 최대 존재할 수 있을 만큼 길이의 포인터를 가리키게 되고 i는 문자열의 길이를 가리키게 되는 투포인터 방식으로 구하게된다.

 

즉 i가 1부터 시작해 len(s)보다 작은 동안, leng은 0에서 시작하게 되고(존재할 수 있는 겹치는 길이는 최소0이므로)

일치하면 leng를 증가시키고 lps[i]는 leng이 되며, i또한 1을 증가시킨다.

만약 일치하지 않는다면 두가지 방식으로 나눈다. 한가지는 leng이 0일때고 (완전히 일치하지 않을때) 다른 하나는 leng=0이 아니라 그 이전에 일치한적이 있어 그이전 최대길이가 해당하는 길이인지 확인해줘야하기 때문에 leng=lps[leng-1]을 통해 그 이전부분이 일치하는 지 확인해준다.

 

결국 이런 투포인터 방식으로 lps를 쉽게 확인 가능하다.

 

def computeLPS(s, lps):

    leng = 0 

    i = 1

    while i < len(s):

        if s[i] == s[leng]:

            leng+=1

            lps[i] = leng

            i+=1

        else:

            if leng!=0:

                leng = lps[leng-1]

            else:

                lps[i] = 0

                i +=1

    return lps

 

s = "ABCA"

lps = [0]*len(s)

 

r = computeLPS(s,lps)

print(r)



'알고리즘' 카테고리의 다른 글

가장 긴 펠린드롬 (구현 , 최적화(?))  (0) 2021.07.07
줄세우기 (위상정렬)  (0) 2021.07.03
문자열 겹치기(구현, KMP)  (0) 2021.06.18
숨바꼭질(다익스트라)  (0) 2021.06.18
화성탐사(다익스트라)  (0) 2021.06.17