我正在寻找一种算法来解决以下问题:
给定n
包含数字 from 0
to9
和m
其他序列的序列,找到等于 的最小(包含最低数量)序列系列n
。
例子
n = 123456
m1 = 12
m2 = 34
m3 = 56
m4 = 3456
output = m1 + m4 = 123456
到目前为止我想到的事情
使用 FSM 或 trie 树的基本贪心技术在开始时找到最长的序列拟合:
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)