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;
}