Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 动态规划中的字符串操作_String_Algorithm_Dynamic_Graph_Language Agnostic - Fatal编程技术网

String 动态规划中的字符串操作

String 动态规划中的字符串操作,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的整

我有一个问题,我有一个长度为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^3


我的下一步是对每个额外的字母执行动态规划以找到答案。如果有人能给我建议怎么做,我会很感激的

以下是一些未经验证的想法。我不确定这是否足够有效(或完全解决),但看起来是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
在后者中是常数时间。我们将寻求对字符串末尾的每个字符应用递归的最佳结果,无论是state
is_kth
还是state
is_after_kth

你能解释一下c'的意思吗?@cracra当然:任何不是
c
的字符。常数是什么,如果我们检查所有的c'?@cracra A是常数时间,因为字母表是有限的(我假设为26?),所以那里的每个计算都被限制为
O(| alphabet |)=O(1)
,假设我们已经将调用提交到
f
。另外,我将如何使用f函数?我会在字符串中的每个字母上运行它吗?运行状态是什么?