가장 긴 반복 서브 시퀀스 찾기


9

주어진 문자열 s, 나는 가장 긴 반복 (적어도 두 번) 하위 시퀀스를 찾고 싶습니다. 즉, 문자열을 찾고 싶습니다w 이는 하위 시퀀스 (연속적 일 필요는 없음)입니다. s 그런 w=ww. 그건,w반은 연속으로 두 번 나타나는 문자열입니다. 참고w 하위 시퀀스입니다 s이지만 반드시 하위 문자열 일 필요는 없습니다.

예 :

'ababccabdc'의 경우 'abc'= 'abc'및 'abc'가 'ababccabdc'에 (최소한) 두 번 나타나기 때문에 'abbcc'입니다.

'addbacddabcd'의 경우 'dd'가 두 번 나타나기 때문에 하나의 옵션은 'dddd'입니다. 길이가 8 인 경우 : 'abcdabcd'. 'abcd'는 두 번 나타나는 'addbacddabcd'의 하위 문자열이기 때문입니다.

가장 긴 반복 서브 시퀀스를 찾는 데 관심이 있습니다. 이것을 "가장 긴 / 가장 큰 사각형 찾기"라고도하지만, 하위 문자열이 아닌 하위 문자열에 대해 사각형이 정의 된 기사를 많이 읽었습니다.

나는 무차별 대입 알고리즘을 쉽게 사용할 수 있습니다. O(n3) 문자열의 중단 점에 대한 모든 옵션을 반복하여 가장 큰 / 가장 긴 공통 하위 시퀀스를 찾을 두 개의 문자열이 있지만 각 검사에는 O(n2) 다이나믹 프로그래밍 기술을 사용하여 O(n3). 가장 긴 공통 하위 시퀀스에 대한보다 효율적인 알고리즘을 찾았습니다.O(n2logn) 따라서 러닝 타임은 O(n3logn).

가장 긴 반복 서브 시퀀스 문제에 대한보다 효율적인 알고리즘을 찾고 있습니다. 아마도 모든 중단 점을 반복한다는 아이디어는 너무 많은 시간을 낭비하고 반복 횟수를 줄일 수 있습니다. 또는 다른 태도를 가진 알고리즘이이 문제를 해결할 수 있습니다.

나는 많은 저널과 이전 질문에서 검색했으며, 찾은 결과의 대부분은 하위 문자열이 아니라 하위 문자열에 관한 것입니다.

또한 접미사 트리를 사용 하여이 작업을 수행 할 수 있지만 하위 문자열과 관련이 있으며 하위 아이디어를 위해 그러한 아이디어를 확장 할 수 있는지 확실하지 않습니다.

제 시간에 실행되는 솔루션을 찾고 있습니다 O(n2). 한 번에 존재하면O(nlogn) 그것은 더 나을 것입니다 (그런 것이 있는지 확실하지 않습니다).


4
접미사 트리 또는 접미사 배열을 찾습니다.
가명

1
그것은 매우 가능성이 없습니다 o(n2)이 시간 알고리즘은 존재한다면 두 길이의 LCS를 찾기 위해 가장 잘 알려진 알고리즘을 이길 수 있습니다.nuv 다음과 같이 : 문자열을 형성 xuxv, 어디 x 이다 n+1$어느 쪽도 나타나지 않는 문자의 사본u 또는 v을 실행 한 다음 o(n2)그것에 시간 알고리즘. 가장 긴 반복 서브 시퀀스의 두 "반쪽"은 반드시x따라서 절반은 uv, LCS 문제 해결.
j_random_hacker

@j_random_hacker LCS는 다음에서 해결할 수 있습니다. O(n+m) 접미사 트리를 사용하거나 O(nlogn)롤링 해시 사용
Evil

@Evil : 아직 방법을 모르겠지만 좀 더 자세히 설명해 주시겠습니까? (당신은 그 시간 복잡성에서 해결할 수있는 가장 긴 공통 하위 문자열을 생각하지 않습니까?)
j_random_hacker

@j_random_hacker 나는 당신이 목표를 비교하고 있다고 생각했습니다. o(n2)LCS (연속적)를 사용하지만 여기에서 언급했듯이 네, 긴 공통 하위 시퀀스에 대해 n ^ 2에서 작동하는 솔루션조차 보지 못했습니다 (많은 페이지에 걸쳐 전파되는 하나의 동적 프로그래밍 코드를 발견했습니다. downvoted 답변). 그래서 나는 단순히 당신의 의견을 오해했습니다. 죄송합니다.
Evil

답변:


-1

다음은 동적 프로그래밍 솔루션입니다.

입력 문자열이 x1xn. 테이블 만들기T 행과 열이 0,,n (어디 n 규칙으로 채워진 문자열의 길이입니다)

T[i,j]={0if i=0 or j=0,T[i1,j1]+1if xi=xj and ij,max(T[i1,j],T[i,j1])otherwise.
답은 입니다.T[n,n]

우리는 몇 가지 가정합시다 와 , 당신의 조건 문장은 사실이다. 그런 다음 위치 의 문자 가 두 서브 시퀀스의 일부 임을 의미합니다 . i,ji=j+1ifdp[i][j] = dp[i - 1][j - 1] + 1i1=j
j_random_hacker

3
컴퓨터 과학에 오신 것을 환영합니다! 소스 코드를 제거하고 아이디어, 의사 코드 및 정확성 주장으로 대체하십시오. 관련 메타 토론에 대해서는 여기여기 를 참조 하십시오 .
Raphael

@Raphael 재귀 수식은 소스 코드로 계산되지 않습니다.
Number945

1
@BreakingBenjamin 선택한 언어에 따라 주어진 되풀이를 문자 그대로 적거나 적을 수 있습니다. 요점은 여기에 설명이 없다는 것입니다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.