📅  最后修改于: 2023-12-03 15:28:27.768000             🧑  作者: Mango
给定一个二进制字符串,你可以执行以下操作之一:
请你计算并返回将该字符串由初始字符串 s 转化为目标字符串 t 所需的最少操作次数。
通过观察题目,我们可以发现:
所以我们可以分别计算将当前位置变成 0 或 1 所需要的次数,取最小值作为这个位置需要的次数。
class Solution:
def minFlips(self, s: str) -> int:
n = len(s)
# 初始化 dp 数组,dp[i][0] 表示将 s[0:i] 转换成以 0 结尾的目标字符串所需要的最少次数;
# dp[i][1] 表示将 s[0:i] 转换成以 1 结尾的目标字符串所需要的最少次数。
dp = [[0, 0] for _ in range(n)]
for i in range(n):
if s[i] == '0':
# 当前位为 0,只有将其翻转成 1 才能达到目标字符串
dp[i][0] = dp[i-1][1]
dp[i][1] = dp[i-1][0] + 1
else:
# 当前位为 1,只有将其翻转成 0 才能达到目标字符串
dp[i][0] = dp[i-1][1] + 1
dp[i][1] = dp[i-1][0]
# 取最后一个字符的最小值即可
return min(dp[n-1][0], dp[n-1][1])
class Solution {
public int minFlips(String s) {
int n = s.length();
// 初始化 dp 数组,dp[i][0] 表示将 s[0:i] 转换成以 0 结尾的目标字符串所需要的最少次数;
// dp[i][1] 表示将 s[0:i] 转换成以 1 结尾的目标字符串所需要的最少次数。
int[][] dp = new int[n][2];
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '0') {
// 当前位为 0,只有将其翻转成 1 才能达到目标字符串
dp[i][0] = dp[i-1][1];
dp[i][1] = dp[i-1][0] + 1;
} else {
// 当前位为 1,只有将其翻转成 0 才能达到目标字符串
dp[i][0] = dp[i-1][1] + 1;
dp[i][1] = dp[i-1][0];
}
}
// 取最后一个字符的最小值即可
return Math.min(dp[n-1][0], dp[n-1][1]);
}
}
该题需要通过动态规划来解决。如果将一个位置翻转成 0 或 1 所需要的次数直接计算,那么时间复杂度将会是 O(n^2)。因此,我们需要使用动态规划来优化时间复杂度。