2025-03-14:统计 1 显著的字符串的数量。用go语言,给定一个二进制字符串 s,请你计算其中被称为“1 显著”的子字符串的数量。
一个子字符串被视为“1 显著”,当它包含的 1 的数量大于或等于 0 的数量的平方。
1 <= s.length <= 40000。
s 仅包含字符 '0' 和 '1'。
输入:s = "101101"。
输出:16。
解释:
1 不显著的子字符串如下表所示。
总共有 21 个子字符串,其中 5 个是 1 不显著字符串,因此有 16 个 1 显著子字符串。
i | j | s[i..j] | 0 的数量 | 1 的数量 |
---|---|---|---|---|
1 | 1 | 0 | 1 | 0 |
4 | 4 | 0 | 1 | 0 |
1 | 4 | 0110 | 2 | 2 |
0 | 4 | 10110 | 2 | 3 |
1 | 5 | 01101 | 2 | 3 |
答案2025-03-13:
题目来自leetcode3234。
1.初始化变量tot1
和切片a
,切片a中包含了-1作为哨兵,用于记录'0'字符的位置。
2.遍历输入二进制字符串s,对于每个字符:
3.返回ans作为结果。
总体时间复杂度:
总体空间复杂度:
在整个过程中,代码根据字符'0'和'1'的分布来计算"1 显著"的子字符串的数量,具体的实现方式是通过维护一个辅助数组a来记录'0'字符的位置,然后根据条件计算"1 显著"的子字符串数量。
package main
import (
"fmt"
)
func numberOfSubstrings(s string) (ans int) {
tot1 := 0
a := []int{-1} // 哨兵
for right, b := range s {
if b == '0' {
a = append(a, right)
} else {
ans += right - a[len(a)-1]
tot1++
}
for k := len(a) - 1; k > 0 && (len(a)-k)*(len(a)-k) <= tot1; k-- {
cnt0 := len(a) - k
cnt1 := right - a[k] + 1 - cnt0
ans += max(a[k]-a[k-1]-max(cnt0*cnt0-cnt1, 0), 0)
}
}
return
}
func main() {
s := "101101"
result := numberOfSubstrings(s)
fmt.Println(result)
}
# -*-coding:utf-8-*-
defnumber_of_substrings(s: str) -> int:
ans = 0
tot1 = 0
a = [-1] # 哨兵
for right, b inenumerate(s):
if b == '0':
a.append(right)
else:
ans += right - a[-1]
tot1 += 1
for k inrange(len(a) - 1, 0, -1):
if (len(a) - k) * (len(a) - k) > tot1:
break
cnt0 = len(a) - k
cnt1 = right - a[k] + 1 - cnt0
ans += max(a[k] - a[k - 1] - max(cnt0 * cnt0 - cnt1, 0), 0)
return ans
if __name__ == "__main__":
s = "101101"
result = number_of_substrings(s)
print(result)
我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展。