。给定字符串 str 和字符 K,任务是找到包含字符 K

str 的所有子字符串的计数。

示例:

朴素的方法一种简单的方法是查找给定字符串中包含字符 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++
//该方法的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实现
导入 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
#该方法的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#
//该方法的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
骇客技术资讯网 | ©All Rights Reserved.