。给定字符串 str 和字符 K,任务是找到包含字符 K
的 str 的所有子字符串的计数。示例:
输入: str = "geeks", K = 'g'
输出: 5
"g", "ge", "gee", "geek" 和 "geeks"是有效的子字符串。
输入: str = “geeksforgeeks”,K = ‘k’
输出: 56
朴素的方法一种简单的方法是查找给定字符串中包含字符 K 的所有子字符串并返回计数。
有效的方法:对于字符串中的每个索引i,找到第一个索引j,使得i≤j并且str [j] = K. 现在,子串 str [i…j], str [i…j + 1], str [i…j + 2], …, str [i…n – 1 ] 将全部包含字符 K 至少一次。这种方法乍一看似乎是 O(N 2),但并没有对每个索引 i,J 再次计算索引 j
对于 j 中所有小于 i 的值来说, 都是有效的指示符。
以下是上述方法的实现:
//该方法的C++实现
#包括
使用命名空间 std;
// 返回索引的函数
// str 中字符 ch 的下一次出现
// 从给定的索引开始
int nextOccurrence(字符串 str, int n,int 开始,字符 ch)
{
for (int i = 开始; i < n; i++) {
// 返回第一个的索引
// ch 的出现
if (str[i] == ch)
返回我;
}
// 没有发现出现的情况
返回-1;
}
// 返回所有计数的函数
// str 包含的子字符串
// 字符ch至少有一个
int countSubStr(字符串 str, int n, char ch)
{
// 存储有效子串的数量
整数cnt = 0;
// ch 在 str 中第一次出现的索引
int j = nextOccurrence(str, n, 0, ch);
for (int i = 0; i < n; i++) {
while (j != -1 && j < i) {
j = nextOccurrence(str, n, j + 1, ch);
}
// str 中索引 i 之后不出现 ch
如果(j==-1)
休息;
// 从索引 i 开始的子字符串
// 结束于索引 j, j+1, ..., n-1// 都是有效的子串
cnt += (n - j);
}
返回cnt;
}
// 驱动代码
int main()
{
字符串str =“geeksforgeeks”;
int n = str.length();
char ch = 'k';
cout << countSubStr(str, n, ch);
返回0;
}
//该方法的Java实现
导入 java.util.*;
GFG级
{
// 返回索引的函数
// str 中字符 ch 的下一次出现
// 从给定的索引开始
静态 int nextOccurrence(字符串 str, int n,
int 开始,字符 ch)
{
for (int i = 开始; i < n; i++)
{
// 返回第一个的索引
// ch 的出现
if (str.charAt(i) == ch)
返回我;
}
// 没有发现出现的情况
返回-1;
}
// 返回所有计数的函数
// str 包含的子字符串
// 字符ch至少有一个
静态 int countSubStr(字符串 str,
整数 n,字符 ch)
{
// 存储有效子串的数量
整数cnt = 0;
// ch 在 str 中第一次出现的索引
int j = nextOccurrence(str, n, 0, ch);
for (int i = 0; i < n; i++)
{
while (j != -1 && j < i)
{
j = nextOccurrence(str, n, j + 1, ch);
}
// str 中索引 i 之后不出现 ch
如果(j==-1)
休息;
// 从索引 i 开始的子字符串
// 结束于索引 j, j+1, ..., n-1
// 都是有效的子串
cnt += (n - j);
}
返回cnt;
}
// 驱动代码
静态公共无效主(字符串[]arg)
{
String str = "geeksforgeeks";
int n = str.length();
char ch = 'k';
System.out.println(countSubStr(str, n, ch));
}
}
// 此代码由 PrinciRaj1992 贡献
#该方法的Python3实现
# 返回索引的函数
# strr 中字符 ch 的下一次出现
# 从给定的索引开始
def nextOccurrence(strr, n, 开始, ch):
对于范围内的 i(开始,n):
# 返回第一个的索引
# ch 的出现
if (strr[i] == ch):
返回我
# 未发现任何事件
返回-1
# 返回所有计数的函数
# strr 的子字符串包含
# 字符 ch 至少一个
def countSubStr(strr, n, ch):
# 存储有效子字符串的数量
碳纳米管 = 0
# strr 中 ch 第一次出现的索引
j = nextOccurrence(strr, n, 0, ch)
对于范围 (n) 内的 i:
while (j != -1 且 j < i):
j = nextOccurrence(strr, n, j + 1, ch)
# strr 中索引 i 之后不出现 ch
如果(j==-1):
休息
# 从索引 i 开始的子字符串
# 并以索引 j, j+1, ..., n-1 结束
# 都是有效的子字符串
cnt += (n - j)
返回cnt
# 驱动程序代码
strr =“geeksforgeeks”
n = 长度(strr)
ch = 'k'
打印(countSubStr(strr,n,ch))
# 此代码由 Mohit Kumar 贡献
//该方法的C#实现
使用系统;
GFG级
{
// 返回索引的函数
// str 中字符 ch 的下一次出现
// 从给定的索引开始
静态 int nextOccurrence(字符串 str, int n,int 开始,字符 ch)
{
for (int i = 开始; i < n; i++)
{
// 返回第一个的索引
// ch 的出现
if (str[i] == ch)
返回我;
}
// 没有发现出现的情况
返回-1;
}
// 返回所有计数的函数
// str 包含的子字符串
// 字符ch至少有一个
静态 int countSubStr(字符串 str,
整数 n,字符 ch)
{
// 存储有效子串的数量
整数cnt = 0;
// ch 在 str 中第一次出现的索引
int j = nextOccurrence(str, n, 0, ch);
for (int i = 0; i < n; i++)
{
while (j != -1 && j < i)
{
j = nextOccurrence(str, n, j + 1, ch);
}
// str 中索引 i 之后不出现 ch
如果(j==-1)
休息;
// 从索引 i 开始的子字符串
// 结束于索引 j, j+1, ..., n-1
// 都是有效的子串
cnt += (n - j);
}
返回cnt;
}
// 驱动代码
静态公共无效主要()
{
String str = "geeksforgeeks";
int n = str.长度;
char ch = 'k';
Console.WriteLine(countSubStr(str, n, ch));
}
}
// 此代码由 AnkitRai01 贡献
56