我有一个只包含两个字符值的字符串:'a'
或'b'
。一个字符可以换成另一个字符值。字符串中的每个字符都有一个与交换它相关的开销。我需要找到交换的最小成本,这样在结果字符串中没有3个连续的字符具有相同的值。
如果我们有一个长度为3的连续字符块,那么我们只交换最小成本的字符。如果我们有一个长度大于3的块,那么我们有许多交换的可能性。我不知道该怎么处理这个案子。如何有效地决定在长度大于3的块中交换哪些字符?
发布于 2020-06-23 00:17:54
我们可以用dynamic programming在O(6n) = O(n)
时间和O(1)
空间中解决这个问题。
当最后三个字符是六个有效的state
之一(即,aab
、aba
、baa
、bba
、bab
、abb
)时,让dp[i][state]
表示直到并包括第i
个字符的最佳成本。然后是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)
https://stackoverflow.com/questions/62517368
复制相似问题