String 动态规划中的字符串操作
我有一个问题,我有一个长度为N的字符串,其中(1≤ N≤ 10^5). 此字符串将只包含小写字母 我们必须重写字符串,使其具有一系列“条纹”,其中同一个字母至少包含K(1)≤ K≤ N) 连续三次 将字符串中的单个特定字母从i更改为j需要花费i。有M个不同的字母,您可以将每个字母更改为 示例:“abcde”是输入字符串。N=5(长度为“abcde”)、M=5(字母为A、B、C、D、E)和K=2(每个字母必须至少重复2次),然后我们得到一个值为aij的M×M矩阵,其中aij是范围为0…1000的整数,A_ii=0表示所有i 011444 20444 65032 55504 370050 在这里,从A到A需要花费0,从A到B需要花费1,从A到C需要花费4,依此类推。从B改为A需要2英镑 本例中的最佳解决方案是将a改为b,将d改为e,然后将两个e都改为c。这将需要1+4+0+0=5步,最后的组合字符串将是“bbccc” 它变得复杂,因为从使用按钮i切换到中间按钮k,然后从按钮k切换到按钮j,而不是直接从i切换到j,可能需要较少的时间(或者更一般地说,可能会有一条从i开始到j结束的变化路径,这为最终从按钮i切换到按钮j提供了最佳的总体成本) 为了解决这个问题,我将矩阵视为一个图,然后执行Floyd Warshall,以找到切换字母的最快时间。这将需要O(M^3),它只有26^3String 动态规划中的字符串操作,string,algorithm,dynamic,graph,language-agnostic,String,Algorithm,Dynamic,Graph,Language Agnostic,我有一个问题,我有一个长度为N的字符串,其中(1≤ N≤ 10^5). 此字符串将只包含小写字母 我们必须重写字符串,使其具有一系列“条纹”,其中同一个字母至少包含K(1)≤ K≤ N) 连续三次 将字符串中的单个特定字母从i更改为j需要花费i。有M个不同的字母,您可以将每个字母更改为 示例:“abcde”是输入字符串。N=5(长度为“abcde”)、M=5(字母为A、B、C、D、E)和K=2(每个字母必须至少重复2次),然后我们得到一个值为aij的M×M矩阵,其中aij是范围为0…1000的整
我的下一步是对每个额外的字母执行动态规划以找到答案。如果有人能给我建议怎么做,我会很感激的 以下是一些未经验证的想法。我不确定这是否足够有效(或完全解决),但看起来是26*3*10^5。重复性可以转换为一个表,尽管使用更高的
K
s,由于状态可能性降低,记忆可能更有效
假设我们已经记录了26个前缀数组,用于使用最佳转换计划,使用路径查找方法将整个列表转换为每个字符。这使我们能够使用函数,cost
计算O(1)
time中字符串中范围的转换成本
结果中的字母可以是以下三种情况之一:要么是字符的k
th实例c
,要么在k
th之前,要么在k
th之后。这会导致普遍的复发:
f(i, is_kth, c) ->
cost(i - k + 1, i, c) + A
where
A = min(
f(i - k, is_kth, c'),
f(i - k, is_after_kth, c')
) forall c'
A
需要恒定的时间,因为字母表是恒定的,假设先前对f
的调用已被提交
f(i, is_before_kth, c) ->
cost(i, i, c) + A
where
A = min(
f(i - 1, is_before_kth, c),
f(i - 1, is_kth, c'),
f(i - 1, is_after_kth, c')
) forall c'
同样地,A
是恒定的时间,因为字母表是恒定的
f(i, is_after_kth, c) ->
cost(i, i, c) + A
where
A = min(
f(i - 1, is_after_kth, c),
f(i - 1, is_kth, c)
)
A
在后者中是常数时间。我们将寻求对字符串末尾的每个字符应用递归的最佳结果,无论是stateis_kth
还是stateis_after_kth
你能解释一下c'的意思吗?@cracra当然:任何不是c
的字符。常数是什么,如果我们检查所有的c'?@cracra A是常数时间,因为字母表是有限的(我假设为26?),所以那里的每个计算都被限制为O(| alphabet |)=O(1)
,假设我们已经将调用提交到f
。另外,我将如何使用f函数?我会在字符串中的每个字母上运行它吗?运行状态是什么?