comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
中等 |
1656 |
第 75 场双周赛 Q3 |
|
给你一个下标从 0 开始的二进制字符串 s
,它表示一条街沿途的建筑类型,其中:
s[i] = '0'
表示第i
栋建筑是一栋办公楼,s[i] = '1'
表示第i
栋建筑是一间餐厅。
作为市政厅的官员,你需要随机 选择 3 栋建筑。然而,为了确保多样性,选出来的 3 栋建筑 相邻 的两栋不能是同一类型。
- 比方说,给你
s = "001101"
,我们不能选择第1
,3
和5
栋建筑,因为得到的子序列是"011"
,有相邻两栋建筑是同一类型,所以 不合 题意。
请你返回可以选择 3 栋建筑的 有效方案数 。
示例 1:
输入:s = "001101" 输出:6 解释: 以下下标集合是合法的: - [0,2,4] ,从 "001101" 得到 "010" - [0,3,4] ,从 "001101" 得到 "010" - [1,2,4] ,从 "001101" 得到 "010" - [1,3,4] ,从 "001101" 得到 "010" - [2,4,5] ,从 "001101" 得到 "101" - [3,4,5] ,从 "001101" 得到 "101" 没有别的合法选择,所以总共有 6 种方法。
示例 2:
输入:s = "11100" 输出:0 解释:没有任何符合题意的选择。
提示:
3 <= s.length <= 105
s[i]
要么是'0'
,要么是'1'
。
根据题目描述,我们需要选择
我们可以枚举中间的建筑,假设为
时间复杂度
class Solution:
def numberOfWays(self, s: str) -> int:
l = [0, 0]
r = [s.count("0"), s.count("1")]
ans = 0
for x in map(int, s):
r[x] -= 1
ans += l[x ^ 1] * r[x ^ 1]
l[x] += 1
return ans
class Solution {
public long numberOfWays(String s) {
int n = s.length();
int[] l = new int[2];
int[] r = new int[2];
for (int i = 0; i < n; ++i) {
r[s.charAt(i) - '0']++;
}
long ans = 0;
for (int i = 0; i < n; ++i) {
int x = s.charAt(i) - '0';
r[x]--;
ans += 1L * l[x ^ 1] * r[x ^ 1];
l[x]++;
}
return ans;
}
}
class Solution {
public:
long long numberOfWays(string s) {
int n = s.size();
int l[2]{};
int r[2]{};
r[0] = ranges::count(s, '0');
r[1] = n - r[0];
long long ans = 0;
for (int i = 0; i < n; ++i) {
int x = s[i] - '0';
r[x]--;
ans += 1LL * l[x ^ 1] * r[x ^ 1];
l[x]++;
}
return ans;
}
};
func numberOfWays(s string) (ans int64) {
n := len(s)
l := [2]int{}
r := [2]int{}
r[0] = strings.Count(s, "0")
r[1] = n - r[0]
for _, c := range s {
x := int(c - '0')
r[x]--
ans += int64(l[x^1] * r[x^1])
l[x]++
}
return
}
function numberOfWays(s: string): number {
const n = s.length;
const l: number[] = [0, 0];
const r: number[] = [s.split('').filter(c => c === '0').length, 0];
r[1] = n - r[0];
let ans: number = 0;
for (const c of s) {
const x = c === '0' ? 0 : 1;
r[x]--;
ans += l[x ^ 1] * r[x ^ 1];
l[x]++;
}
return ans;
}