java第k小的子串_具有k个的总子串

给定二进制字符串s,我们需要找到其子字符串的数量,其中包含恰好为“1”的k个字符 .

例如:s =“1010”且k = 1,答案= 6 .

现在,我在累积和数组上使用二进制搜索技术解决了它 .

我还用另一种方法来解决它 . 方法如下:

对于每个位置i,找到在i处结尾的总子串,其中包含正好为k的'1'字符 .

为了找到在i处结尾的总子串,其中包含恰好为1的k个字符,它可以表示为索引j的集合,使得子串j到i恰好包含k'1' . 答案是集合的大小 . 现在,为了找到给定位置i的所有这样的j,我们可以将问题重新解释为找到所有j这样的

从[1]到[j - 1]的1的数量=从1到i的总数 - [从j到i的总数= k] .

即,从[1]到[j-1]的个数= C [i] -k

等于C [j - 1] = C [i] - k,

其中C是累积和数组,其中C [i] =从1到i的字符串的字符总和 . 现在,问题很简单,因为我们可以通过计算总和为C [i] -k的所有前缀来使用等式找到j的所有可能值 .

但我找到了这个解决方案,

int main() {

cin >> k >> S;

C[0] = 1;

for (int i = 0; S[i]; ++i) {

s += S[i] == '1';

++C[s];

}

for (int i = k; i <= s; ++i) {

if (k == 0) {

a += (C[i] - 1) * C[i] / 2;

} else {

a += C[i] * C[i - k];

}

}

cout << a << endl;

return 0;

}

在代码中,S是给定的字符串,K如上所述,C是累积和数组,a是答案 . 使用乘法的代码是什么,我不知道 . 有人可以解释算法吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值