![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/011b153934294160971866d47224f950.png)
代码
class Solution {
// 方法接收一个字符串s和一个字符c,返回s中包含字符c的所有子字符串的数量
public long countSubstrings(String s, char c) {
long cnt = 0; // 用于计数字符串s中字符c出现的次数
// 遍历字符串s中的每个字符,如果字符与c相同,则cnt增加
for (char i : s.toCharArray()) {
if (i == c) {
cnt++;
}
}
// 如果字符c在字符串s中没有出现,或者只出现了一次,直接返回cnt
// 因为如果没有出现,那么不可能形成子字符串;如果只出现一次,那么只有一个单字符子字符串
if (cnt == 0 || cnt == 1) return cnt;
// 如果字符c在字符串s中出现了至少两次,计算包含字符c的所有可能子字符串的数量
// 这里使用组合数学的概念:
// 1. cnt个c可以形成cnt*(cnt-1)/2个包含至少两个c的子字符串
// 2. 加上cnt个单独的c字符本身,总数为cnt*(cnt-1)/2 + cnt
return cnt * (cnt - 1) / 2 + cnt;
}
}
解释
这个方法首先计算字符串s
中特定字符c
出现的总次数cnt
。然后,基于cnt
的值,使用组合数学的原理来计算所有可能的子字符串数量。如果cnt
为0或1,直接返回cnt
,因为0表示没有包含字符c
的子字符串,1表示只有一个单字符子字符串。
如果c
出现了2次或以上,那么可以形成的子字符串数量包括:
- 所有包含至少两个
c
的子字符串的数量,这可以通过cnt * (cnt - 1) / 2
来计算。这是因为从cnt
个位置选择2个位置作为子字符串的起始和结束位置的方法数(即组合数C(cnt, 2))。 - 加上每个单独的
c
自身作为子字符串,即额外的cnt
次。
通过这种方式,countSubstrings
方法能够高效地计算出包含特定字符c
的所有可能子字符串的数量。