题目:一个二进制字符串 s
。在一秒之中,所有 子字符串 "01"
同时 被替换成 "10"
。这个过程持续进行到没有 "01"
存在。求完成这个过程所需要的秒数。
思路:1往前挪的最少次数是前面0的个数,还需考虑如果两个1连续时,后面的1无法移动,导致所需秒数+1。动态规划一次遍历求解
过程:
1. dp[i] 表示 s[0:i]完成目标所需的最少秒数,pre0是遍历到当前出现0的个数
2.转移方程:
s[i] 为 0,dp[i] = dp[i-1]
s[i] 为1且前面有0,dp[i] = max(pre0, dp[i-1] + 1)
int secondsToRemoveOccurrences(string s) {
int pre0 = 0;
int dp = 0;
for(int i = 0; i < s.size(); ++i){
if(s[i] == '0') ++pre0;
else if(pre0){
dp = max(dp + 1, pre0);
}
}
return dp;
}