次の問題を解決するアルゴリズムを探しています。
からまでのn
数字を含む数列と他の数列が与えられた場合、に等しい最小の (最小量を含む) 数列を見つけます。0
9
m
n
例
n = 123456
m1 = 12
m2 = 34
m3 = 56
m4 = 3456
output = m1 + m4 = 123456
今まで思ったこと
FSM またはトライ木を使用して、最初に適合する最長のシーケンスを見つける基本的な貪欲な手法:
while n not null
longest = the longest sequence fitting in the beginning of n
print longest
n = n - longest
反例
n = 123456
m1 = 12
m2 = 1
m3 = 23456
m4 = 3
m5 = 4
m6 = 5
m7 = 6
algorithm will find m1 + m4 + m5 + m6 + m7 (12 + 3 + 4 + 5 + 6)
algorithm should find m2 + m3 (1 + 23456)
別の貪欲な方法
array = {n} #this represents words to be matched
while array not empty
(word, index) = find longest sequence covering part of any word in array and its index
split array[index] into two words - first before found word, second after it
if any of those split items is null
remove it
反例
n = 12345678
m1 = 3456
m2 = 1
m3 = 2
m4 = 7
m5 = 8
m6 = 123
m7 = 45
m8 = 678
algorithm will find m2 + m3 + m1 + m4 + m5 (1 + 2 + 3456 + 7 + 8)
algorithm should find m6 + m7 + m8 (123 + 45 + 678)