3258. 统计满足 K 约束的子字符串数量 I

给你一个 二进制 字符串 s 和一个整数 k。

如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束:

字符串中 0 的数量最多为 k。
字符串中 1 的数量最多为 k。
返回一个整数,表示 s 的所有满足 k 约束 的
子字符串
的数量。

示例 1:

输入:s = "10101", k = 1

输出:12

解释:

s 的所有子字符串中,除了 "1010"、"10101" 和 "0101" 外,其余子字符串都满足 k 约束。

示例 2:

输入:s = "1010101", k = 2

输出:25

解释:

s 的所有子字符串中,除了长度大于 5 的子字符串外,其余子字符串都满足 k 约束。

示例 3:

输入:s = "11111", k = 1

输出:15

解释:

s 的所有子字符串都满足 k 约束。

提示:

1 <= s.length <= 50
1 <= k <= s.length
s[i] 是 '0' 或 '1'。

解题思路:
题目要求计算一个字符串中满足特定条件的子字符串数量。具体来说,一个子字符串被视为满足条件的,如果它包含的0的数量不超过k,或者1的数量不超过k。
思路分析
1.双层循环遍历:
使用外层循环遍历字符串的每一个起始位置。
使用内层循环从当前起始位置遍历到字符串的末尾,构建不同的子字符串。
2.计数器:
在内层循环中,使用两个计数器 cnt0 和 cnt1 分别记录当前子字符串中0和1的数量。
3.条件判断:
每次构建一个新的子字符串时,检查 cnt0 和 cnt1 是否满足条件(即 cnt0 <= k 或 cnt1 <= k)。
如果满足条件,则将满足条件的子字符串数量 ans 增加1。
4.返回结果:
最后返回满足条件的子字符串总数 ans。

完整代码:
    /**
     * 计算字符串中满足特定条件的子字符串数量
     * 一个子字符串被视为满足条件的,如果它包含的0的数量不超过k,或者1的数量不超过k
     * 
     * @param s 输入的字符串,只包含字符'0'和'1'
     * @param k 子字符串中0或1的最大允许数量
     * @return 满足条件的子字符串数量
     */
    public int countKConstraintSubstrings(String s, int k) {
        // 字符串长度
        int n = s.length();
        // 用于累计满足条件的子字符串数量
        int ans = 0;
        // 外层循环遍历字符串的起始位置
        for (int i = 0; i < n; i++) {
            // 初始化计数器,分别用于统计当前子字符串中0和1的数量
            int cnt0 = 0, cnt1 = 0;
            // 内层循环从当前起始位置遍历到字符串末尾,构建不同的子字符串
            for (int j = i; j < n; j++) {
                // 根据字符类型更新计数器
                if (s.charAt(j) == '0') {
                    cnt0++;
                } else {
                    cnt1++;
                }
                // 如果当前子字符串中0或1的数量不超过k,则认为该子字符串满足条件,累计数量增加
                if (cnt0 <= k || cnt1 <= k) {
                    ans++;
                }
            }
        }
        // 返回满足条件的子字符串总数
        return ans;
    }
posted @ 2024-11-12 14:38  JAVA-CHENG  阅读(9)  评论(0编辑  收藏  举报