给出一个数字序列,例如:1, 2, 1, 2
。
是否有任何知名的算法可以检测重复并将其分组在一起,从而使所得序列的长度尽可能短?
例如,对于先前的序列,结果将为(1, 2)x2
。
更多示例:
Input: 1, 1, 1, 2, 1, 1, 1, 2
Output: ((1)x3, 2)x2
Input: 1, 2, 1, 2, 1, 2
Output: (1, 2)x3
Input: 1, 1, 1, 2, 1, 2
Output: (1)x2, (1, 2)x2
编辑:
结果的长度(例如(1, 2)x2
)不包括有关分组和重复的任何辅助信息(即忽略(),x
和x
之后的数字)。
例如,(1, 2)x2
的长度实际上是2。
((1)x3, 2)x2
的长度仍为2,因为我们仅考虑属于原始序列的元素数(在这种情况下为1和2)。
答案 0 :(得分:1)
您可以使用动态编程方法。让我们将n
定义为长度输入序列,并将DP[i][j]
定义为子字符串将被压缩为的最小可能长度,从索引i
开始到索引j
结束。然后有两种情况:
一致地粘合:DP[i][j] = min(DP[i][k] + DP[k + 1][j])
从k
到i
的所有j - 1
;
重复:对于所有这样的DP[i][j] = min(DP[i][k])
,k
都将子字符串i..j
划分为相同的子字符串长度k - i + 1
。我认为最小值应为k
的最低值。
在两个选项中,选择最小值。字符串本身也可以还原(可以另外存储并重新计算)。从1到DP[i][i] = 1
的所有i
的初始数据n
。答案在DP[1][n]
中(如果使用1-index数组)。