다른 문자열을 재구성하기위한 하위 문자열의 서브 세트가 있습니까?

cs.stackexchange https://cs.stackexchange.com/questions/117765

  •  28-09-2020
  •  | 
  •  

문제

주어진 하위 문자열 세트를 사용하여 주어진 문자열을 재구성 할 수 있는지 여부를 확인하기 위해 고성능 알고리즘을 찾고 있습니다. 자세한 내용 :

우리의 문자열이 알파벳 $ \ sigma $ 에 있다고 가정 해 봅시다.

입력 :

  • 문자열 $ s \ in \ sigma ^ * $
  • strings $ a={a_1, a_2, ..., a_n \} \ subset \ sigma ^ * $ .

출력 :

  • $ \가 존재하는지 여부는 \ \ (b_1, b_2, \ ldots, b_m \ in a : b_1 + b_2 + \ cdots + b_m= s $

    여기서 $ + $ 은 문자열 연결입니다.

    예를 들어 $ s= {} $ $ abcd $ "및 $ a={$ " $ ab $ " $, $ < / span> " $ CD $ " $, $ " $ AC $ " $ \} $ 대답은 true입니다. 이 질문의 목적을 위해 $ a $ 은 필요한 경우 여러 번 다시 사용될 수 있다고 가정합니다.

도움이 되었습니까?

해결책

$ a $ 에서 문자열을 재사용 할 수있는 경우 동적 프로그래밍으로 해결할 수 있습니다. 먼저 $ 접두어 트리에서 $ (jo.wikipedia.org/wiki/generalized_suffix_tree" rel="nofollow noreferrer"> 링크 ) 및 링크 $ s [i : end] $ $ a $ 에서 생성 될 수있는 경우 재귀 적으로 detrmine : $ \ ell $ 문자열의 길이가되고, wlog가 $ s $ $ \ $$ $ a \ \ \ \ $ \} $ 을 가져옵니다. Moroever, $ m [i] \ \ {0,1 \} $ {0,1 \} $ $ s [i : \ ell] $ $ a $ 의 요소로 구성 할 수 있습니다. $ M [i] \ INTED \ IFTY $ $ i= 0, \ dots, \ ell-1 $ < / span> 및 $ m [\ ell]= 1 $ ( $ s [\ ell]=$$ < / span>). 이제 $ f (i) $ $ m [i] $ 을 재귀 적으로 계산하는 함수입니다. 그것은 이미 계산되지 않았습니다. $ f (i) $ 이 호출되면 $ a $ 의 접미사 트리 루트에서 시작할 때 및 $ s [i], s [i + 1], \ dots $ $ j $ , 해당 노드가 $ a $ 에 있고 $ f (j) $ . $ 1 $ 을 반환하면 $ m [i]= 1 $ $ 1 $ . 그렇지 않으면 $ s [j + 1], s [j + 2], \ dots $ $ a $ 또는 잎에 도달했습니다. 성공하지 못한 경우 $ m [i]= 0 $ 을 설정하고 $ 0 $ 을 반환합니다. 문제를 결정하기 위해 $ f (1) $ 을 호출하십시오. 최악의 경우 복잡성은 $ d $ 의 깊이가있는 $ \ ell d $ 입니다. 접미사 트리 ( $ A $ 에서 가장 긴 시퀀스), 접두사 트리의 구성 비용.

하나의 해결책이 발견되는 즉시 재귀 통화 검색이 중지되므로 많은 경우에 최악의 시나리오가 피할 수 있습니다. 따라서 실제로 $ \ ell d $ 부분이 훨씬 적을 수 있습니다. 접미사 트리의 구성은 $ a $ 에 따라 비쌉니다. 그러나 $ a $ 이 여러 문자열 $ s $ 에 사용되면 비용이 상각됩니다. $ a $ 이 정말 크고 $ s $ 은 짧습니다. 요소를 정렬하는 것이 좋습니다. $ a $ 을 수행하고 순회 대신 이진 검색을 수행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top