다른 문자열을 재구성하기위한 하위 문자열의 서브 세트가 있습니까?
-
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 $ 을 수행하고 순회 대신 이진 검색을 수행하십시오.