알고리즘이 올바른지 확인하고 싶습니다. 생략 모두 공백으로 n 문자의 문자열이 주어 O (n^2)에 공백없는 문자열을 재구성하십시오.
,Ex: "itwasthebestoftimes"
문자열을 단어의 시퀀스로 분할 될 수 있는지를 결정하는 동적 프로그래밍 알고리즘을 제공하고있는 유효한 문자열을 재구성 O (n)의 공백.
내 생각 :
먼저 문자열의 모든 문자열을 찾을 수 (O (N 2)), 각 문자열지도 간격으로 공간과 길이에 위치합니다.
Ex: "it was the best"
[] [-] [-] [--]
[---] []
[]
(보기 쉽도록 공간이 추가됨). 위의 예에서
은 "그것"유효하며 등 문자열 "TWAS"3 가져도 유효 "을"2 간격 값을 취득하고, 제의 값을 얻는다 그런 다음 간격의 집합에서 최대 비 중첩 길이를 찾기 위해 최소 최대 문제로 축소됩니다. 유효한 문자열은 모든 글자를 포함해야하므로, 최대 길이가 겹치지 않는 간격이 답이 될 것이고, 이것을 찾는 것은 Theta (n * log (n))를 취한다.
따라서 해결책은 O를 취할 것 (N 2 + N * 로그 (N)) = O (N 2)
내 올바른 생각인가?
없는 경우, 전체 문자열은 단어로 잘라 될 수 있는가? 겹치기 때문에 새로운 하위 문자열을 더 낮은 행에 넣으려고 할 때, 어떻게 알 수 있습니까? 행의 기존 하위 문자열을 재배치하여 어딘가에 새로운 하위 문자열에 맞출 수 있습니까? – avysk
죄송합니다. 수정되었습니다. 서브 스트링이 어느 행에 들어가는 지 상관하지 않습니다. 미니 맥스 솔버는 임의적입니다. 중요한 것은 간격의 좌표로 주어진 충돌이 있는지 여부입니다.행은 시각적 표현을 쉽게하기 위해서만 존재합니다. – mrybak3
사실, 총 길이가 가장 짧은 간격의 부분 집합을 찾는 O (n log n) 알고리즘에 대한 포인터가 있습니까? O (n^2)에서 (같은 동적 프로그래밍을 사용하여) 쉽게 할 수 있지만, O (n log n)에서이를 수행하는 방법을 즉시 알지 못합니다. 이 문제를 최대 간격 *이 아닌 분리 간격의 최대 값 *을 찾는 것과 혼용하지 않으시겠습니까? 최대 number greedy 알고리즘은 O (n log n)입니다. – avysk