위키득계정 ↗
기술

마나커 알고리즘

마나커 알고리즘기술
영어
Manacher’s algorithm
대상
연속한 회문 부분 문자열
시간 복잡도
O(n)
대표 출력
중심별 홀수 및 짝수 회문의 반지름 배열
마나커 알고리즘은 문자열의 각 중심에서 만들 수 있는 회문 부분 문자열의 범위를 선형 시간에 구하는 알고리즘이다. 회문을 전부 문자열로 나열하는 대신 중심별 최대 반지름을 저장하여 전체 회문 정보를 압축한다.

회문과 중심

회문은 앞에서 읽은 내용과 뒤에서 읽은 내용이 같은 문자열이다. 홀수 길이 회문의 중심은 문자 하나이고, 짝수 길이 회문의 중심은 두 문자 사이다. 마나커 알고리즘은 이 중심들을 기준으로 좌우 대칭인 범위를 계산한다. 문자를 건너뛰는 회문 부분수열 문제와는 다르다.

반지름으로 저장하기

예를 들어 cabac의 가운데 b를 중심으로 한 회문은 b, aba, cabac다. 중심 문자를 포함해 한쪽으로 센 최대 반지름을 3으로 저장하면 길이가 1, 3, 5인 회문이 모두 존재함을 알 수 있다. 짝수 회문에서는 반지름과 전체 길이의 환산 규칙을 따로 정의한다.

대칭 위치의 정보 재사용

이미 확인한 회문 구간 안에서 새 중심을 처리할 때는 기존 중심의 반대편 위치에 저장한 반지름을 참고한다. 확인된 구간을 벗어나지 않는 부분은 재사용하고, 바깥쪽으로 더 확장할 수 있는지만 비교한다. 오른쪽 경계가 전진하는 총량이 제한되므로 전체 계산이 O(n)에 끝난다.

선형 시간의 의미

같은 문자만 n개 이어진 문자열에는 위치가 다른 회문 부분 문자열이 n(n+1)/2개 있다. 따라서 모두의 위치를 개별 출력하는 시간까지 선형이라고 할 수는 없다. 알고리즘이 선형 시간에 만드는 것은 중심별 반지름 정보다. 이 배열에서 최장 회문의 길이나 위치별 회문 개수 등을 얻을 수 있다.

관련 문서

문자열 / 부분 문자열 / 시간 복잡도 / Z 함수 (문자열) / 동적 계획법 / 최장 공통 부분수열