交换字符串中字符的最低成本,因此没有 3 个相同的字符是连续的

Minimum cost of swapping chars in string so no 3 same are consecutive

我有一个仅包含两个字符值的字符串:'a''b'。一个 char 可以换成另一个 char 值。字符串中的每个字符都有一个与交换它相关的成本。我需要找到交换的最低成本,以便在结果字符串中没有 3 个具有相同值的连续字符。

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

我们可以在 O(6n) = O(n) 时间和 O(1) space 内用 dynamic programming 解决这个问题。

当最后三个字符是六个有效 state 之一(即 aabababaabbabababb)。然后 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)