Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 交换字符串中字符的最低成本,这样就不会有3个相同的字符是连续的_String_Algorithm_Optimization_Minimize_Minimization - Fatal编程技术网

String 交换字符串中字符的最低成本,这样就不会有3个相同的字符是连续的

String 交换字符串中字符的最低成本,这样就不会有3个相同的字符是连续的,string,algorithm,optimization,minimize,minimization,String,Algorithm,Optimization,Minimize,Minimization,我有一个只包含两个字符值的字符串:'a'或'b'。可以将一个字符替换为另一个字符值。字符串中的每个字符都有与交换相关的开销。我需要找到交换的最小成本,这样在结果字符串中就不会有3个连续的字符具有相同的值 如果我们有一个长度为3的连续字符块,那么我们只需交换最小成本字符。如果我们有一个大于长度3的区块,那么我们有很多交换的可能性。我不知道怎么处理这个案子。如何有效地决定在长度大于3的块中交换哪些字符?我们可以在O(6n)=O(n)时间和O(1)空间中解决这个问题 让dp[i][state]表示包含

我有一个只包含两个字符值的字符串:
'a'
'b'
。可以将一个字符替换为另一个字符值。字符串中的每个字符都有与交换相关的开销。我需要找到交换的最小成本,这样在结果字符串中就不会有3个连续的字符具有相同的值


如果我们有一个长度为3的连续字符块,那么我们只需交换最小成本字符。如果我们有一个大于长度3的区块,那么我们有很多交换的可能性。我不知道怎么处理这个案子。如何有效地决定在长度大于3的块中交换哪些字符?

我们可以在
O(6n)=O(n)
时间和
O(1)
空间中解决这个问题

dp[i][state]
表示包含
i
第个字符的最佳成本,当最后三个字符是六个有效
state
中的一个时(即
aab
aba
baa
bba
bab
abb
)。然后对于
i>2

dp[i][aab] ->
  if s[i] == "a":
    cost[i] + dp[i-1][baa]
  else:
    dp[i-1][baa]

dp[i][aba] ->
  if s[i] == "a":
    min(dp[i-1][aab], dp[i-1][bab])
  else:
    cost[i]+ min(dp[i-1][aab], dp[i-1][bab])

... (left as an exercise)