문자열에서 가장 긴 반복 패턴 찾기


9

문자열에서 가장 긴 반복 패턴을 찾는 효율적인 알고리즘을 찾고 있습니다.

예를 들어 다음과 같은 숫자 문자열을 고려하십시오.

5431428571428571428571428571427623874534.

보시다시피, 142857142857이 문자열에서 몇 번 (적어도 두 번) 반복되는 가장 긴 패턴입니다.

반복되는 줄에는 무차별적인 것이 아니라 어떤 생각도 포함되어서는 안됩니까?


3
"두 번"의 의미를 정의하지 않았지만 "두 번"이 "몇 번"으로 계산되면 더 142857길기 때문에 가장 142857142857길지 않습니다. “반복 된 패턴”이 의미하는 바를 명확히하기 위해 질문을 편집해야한다고 생각합니다.
이토 쓰요시

아주 좋은 지적입니다. 질문을 업데이트하겠습니다.

8
패턴의 발생이 서로 분리되어야합니까? 그렇지 않은 경우, 142857142857은 여전히 ​​가장 긴 반복이 아닙니다. 142857142857142857142가 두 번 발생합니다. 어쨌든 이와 같은 질문에 대한 일반적인 대답은 "접미사 트리"입니다.

답변:


15

이 문제는 놀라 울 정도로 사소한 문제입니다. 먼저, 두 개의 무차별 알고리즘. 정사각형 ( "반복 패턴")의 길이는 그리고 위치 , 시간이 걸립니다 영형()확인합니다. 우리가 다 넘어 가면우리는 영형()연산. 먼저 반복하여 개선 할 수 있습니다거리를두고 두 개의 실행 포인터로 문자열을 스캔합니다. . 이런 식으로, 길이의 제곱을 확인할 수 있습니다2 선형 시간으로 존재하며 영형(2).

Kolpakov와 Kucherov는 한 번에 한 단어로 모든 최대 반복 을 찾기위한 알고리즘을 개발했습니다.영형() [1] 및 해당 알고리즘을 사용하여 시간의 모든 최대 제곱을 찾을 수 있습니다. 영형(). 반복 형태의 subword입니다케이엑스, 어디 케이2엑스 올바른 접두사입니다 . 그 반복에 포함 된 가장 큰 사각형은(케이/2)2. 이 수식을 사용하면 단어의 모든 최대 반복 횟수가 주어집니다.영형() 가장 큰 광장을 찾을 수 있습니다.


[1] Kolpakov, R. 및 Kucherov, G. (1999). 선형 시간으로 단어에서 최대 반복 찾기 . 년 에 컴퓨터 과학, 1999 년 40 연례 심포지엄의 기초 (PP. 596-604). IEEE.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.