leetcode 3228. 将 1 移动到末尾的最大操作次数 中等
给你一个 二进制字符串 s。
你可以对这个字符串执行 任意次 下述操作:
- 选择字符串中的任一下标
i(i + 1 < s.length),该下标满足s[i] == '1'且s[i + 1] == '0'。 - 将字符
s[i]向 右移 直到它到达字符串的末端或另一个'1'。例如,对于s = "010010",如果我们选择i = 1,结果字符串将会是s = "000110"。
返回你能执行的 最大 操作次数。
示例 1:
输入: s = "1001101"
输出: 4
解释:
可以执行以下操作:
- 选择下标
i = 0。结果字符串为s = "0011101"。 - 选择下标
i = 4。结果字符串为s = "0011011"。 - 选择下标
i = 3。结果字符串为s = "0010111"。 - 选择下标
i = 2。结果字符串为s = "0001111"。
示例 2:
输入: s = "00111"
输出: 0
提示:
1 <= s.length <= 10^5s[i]为'0'或'1'。
分析:不妨设当前已经移动过 k 个 1,此时这 k 个 1 在 s 中的位置一定是连续的,设这一串连续的 1 最右边的位置为 pos。接下来向右边继续寻找下一个 1,此时需要把这一串 1 都移动一次,答案就要增加 k,且连续的 1 的总长度 k 变成 k+1.这样一直寻找右边的 1,直到找到最后一个位置即可。
int maxOperations(char* s) {int cnt=0,ans=0,pos=0,len=strlen(s);for(int i=0;i<len;++i){if(s[i]=='1'){if(i-pos>1)ans+=cnt;cnt++,pos=i;}else if(i==len-1&&s[i]=='0')ans+=cnt;}return ans;
}
