列表

详情


2489. 固定比率的子字符串数

给定一个二进制字符串 s 和两个整数 num1num2num1num2 为互质。

比率子串 是 s 的子串,其中子串中 0 的数量与 1 的数量之比正好是 num1 : num2

返回 s 的 非空 比率子串的个数。

注意:

 

示例 1:

输入: s = "0110011", num1 = 1, num2 = 2
输出: 4
解释: 有 4 个非空的比率子串。
- 子字符串 s[0..2]: "0110011"。它包含一个 0 和两个 1。比例是 1:2。
- 子字符串 s[1..4]: "0110011"。它包含一个 0 和两个 1。比例是 1:2。
- 子字符串 s[4..6]: "0110011"。它包含一个 0 和两个 1。比例是 1:2。
- 子字符串 s[1..6]: "0110011"。它包含两个 0 和四个 1。比例是 2:4 == 1:2。
它可以显示没有更多的比率子串。

示例 2:

输入: s = "10101", num1 = 3, num2 = 1
输出: 0
解释: s 没有比率子串,返回 0。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long fixedRatio(string s, int num1, int num2) { } };

cpp 解法, 执行用时: 236 ms, 内存消耗: 85 MB, 提交时间: 2023-10-21 23:15:50

class Solution {
public:
    long long fixedRatio(string s, int num1, int num2) {
        long long ans = 0, a = 0, b = 0;
        unordered_map<long long, long long> mp;
        mp[0]++;
        for(auto c : s) {
            if(c == '0') a++;
            else b++;
            ans += mp[a * num2 - b * num1]++;
        }
        return ans;
    }
};

python3 解法, 执行用时: 316 ms, 内存消耗: 29.4 MB, 提交时间: 2023-10-21 23:15:34

class Solution:
    def fixedRatio(self, s: str, num1: int, num2: int) -> int:
        dc = defaultdict(int)
        dc[0], one, zero, res = 1, 0, 0, 0
        for i in s:
            if i == '1': one += 1
            else: zero += 1
            tep = num1 * one - num2 * zero
            res += dc[tep]
            dc[tep] += 1
        return res
        
    def fixedRatio2(self, s: str, num1: int, num2: int) -> int:
        pre = defaultdict(int)
        pre[0] = 1
        one,zero = 0,0
        ans = 0
        for c in s:
            if c == '1':
                one += 1
            else:
                zero += 1
            ans += pre[num1 * one - num2 * zero]
            pre[num1 * one - num2 * zero] += 1
        return ans

上一题