알고리즘 악 보 일기 - KMP 알고리즘 python 구현

3500 단어
KMP 안내
KMP 알고리즘 이 무엇 인지 에 대해 서 는 대 신의 블 로 그 를 보 세 요. 완 일 봉 - 문자열 에 맞 는 KMP 알고리즘 막 귀 막 을 너무 잘 썼 습 니 다. 하지만 그 가 말 한 부분 은 표 의 아래 표 와 각 참고서 가 어 울 리 지 않 습 니 다.응시 수 요 를 위해 서 내 가 이해 하 는 next 배열 로 바 뀌 었 다.
KMP 알고리즘 - NEXT 배열
이것 은 숙제 문제 입 니 다. S = "abcaabbabcabaacbacba" 실효 함수 의 값 [- 1, 0, 0, 0, 1, 1, 2, 0, 1, 2, 3, 4, 2, 1, 1, 0, 0, 0, 0] 을 구 합 니 다. 물론 이것 은 너무 길 어서 우리 가 명 S = "abcdabcy" 를 설명 하 는 데 불편 합 니 다. 그러면 실효 편지 수 를 손 으로 쓰 려 면 첫 번 째 는 "- 1" 이 고 abcd 는 반드시 - 1000, 두 번 째 a 가 나타 날 것 입 니 다.이 때 는 0 이 고, 그 다음 bc 는 12 이 며, y 는 3 에 대응한다.있 습 니 다. [- 1, 0, 0, 0, 1, 2, 3]
그럼 프로그램 으로 이 루어 지면 요?
def pipeizhi(p):
    # abcdabcy
    # next     next[]:-1    0    0    0    0    1    2    3
    j = 0
    k = -1
    next = [-1]
    for i in range(1, len(p)):
        next.append(0) #      next   [-1,0,0,0...]
    try:
        while (j < len(p) - 1):
            if k == -1 or p[j] == p[k]: 
   #      ,      。j         , k         。          
                j += 1
                k += 1
                next[j] = k
            else:
                k = next[k]
    except IndexError:
        print next, k, j  #        
    return next

KMP 알고리즘 구현
이제 next 배열 이 있 으 면 하고 싶 은 대로 할 수 있 습 니 다.
def KMP(s, t): #s     ,t    
    slen = len(s)
    tlen = len(t)
    if slen >= tlen:
        i = 0
        j = 0
        next = pipeizhi(t)
       # print next
        while i < slen: #    
            print [i,j]
            if j == -1 or s[i] == t[j]: 
       #i   ,j                    。
                i += 1
                j += 1
            else:
                j = next[j]
            if j == tlen:
                return i - tlen
    return -1 #-1       

좋은 웹페이지 즐겨찾기