comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
中等 |
1593 |
第 407 场周赛 Q3 |
|
给你一个 二进制字符串 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 <= 105
s[i]
为'0'
或'1'
。
我们用一个变量
然后我们遍历字符串
最后返回答案即可。
时间复杂度
class Solution:
def maxOperations(self, s: str) -> int:
ans = cnt = 0
for i, c in enumerate(s):
if c == "1":
cnt += 1
elif i and s[i - 1] == "1":
ans += cnt
return ans
class Solution {
public int maxOperations(String s) {
int ans = 0, cnt = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
if (s.charAt(i) == '1') {
++cnt;
} else if (i > 0 && s.charAt(i - 1) == '1') {
ans += cnt;
}
}
return ans;
}
}
class Solution {
public:
int maxOperations(string s) {
int ans = 0, cnt = 0;
int n = s.size();
for (int i = 0; i < n; ++i) {
if (s[i] == '1') {
++cnt;
} else if (i && s[i - 1] == '1') {
ans += cnt;
}
}
return ans;
}
};
func maxOperations(s string) (ans int) {
cnt := 0
for i, c := range s {
if c == '1' {
cnt++
} else if i > 0 && s[i-1] == '1' {
ans += cnt
}
}
return
}
function maxOperations(s: string): number {
let [ans, cnt] = [0, 0];
const n = s.length;
for (let i = 0; i < n; ++i) {
if (s[i] === '1') {
++cnt;
} else if (i && s[i - 1] === '1') {
ans += cnt;
}
}
return ans;
}