具有相同数量的小写字母和大写字母的子字符串
给予细绳S.由小写和大写字母组成,任务是找到数量子串具有相同数量的小写和大写字母。
例子:
输入:s =“极客”
输出:3.
解释:
以下是具有相同数量的小写和大写字母的子字符串:
- “ge”
- “极客”
- “ek”
因此,子串的总计数为3。
输入:s =“Womensday”
输出:4.
天真的方法:解决给定问题的最简单方法是生成给定字符串的所有可能的子字符串S.并增加子字符串的计数1如果该子字符串包含相同数量的小写和大写字母。检查所有子串后,打印值数数作为结果。
时间复杂性:上3.)
辅助空间:O(1)
有效的方法:可以通过考虑每个小写和大写字母来解决给定的问题1和-1然后,然后是找到具有总和的子阵列的计数0.。按照解决问题的步骤:
- 初始化A.Hashmap., 说m存储所有前缀的频率。
- 初始化变量表示,Currentsum.作为0.和res.作为0.这分别存储每个前缀的总和和结果子字符串的数量。
- 遍历字符串并执行以下步骤:
- 如果当前字符为大写,则递增值Currentsum.经过1。否则,减少价值Currentsum.经过-1。
- 如果是值Currentsum.是0.,然后增量值res.经过1。
- 如果是值Currentsum.存在于映射中m,然后增量值res.经过m [currentsum]。
- 增量频率Currentsum.在Hashmap.m经过1。
- 完成上述步骤后,打印值res.作为结果。
以下是实施上述方法:
C ++
//用于上述方法的C ++程序
#include
使用
名称空间
STD;
//函数寻找计数
//具有相同数量的子串
//大写和小写字符
int
countsubstring(字符串&s,
int
ñ)
{
//存储前缀的计数
//考虑大写的总和
//和小写字符为1和-1
UNORDED_MAP <.
int
那
int
> prevSum;
//存储子串的计数
//具有相同数量的小写
//和大写字符
int
res = 0;
//存储到目前为止所获得的总和
int
Currentsum = 0;
为了
(
int
我= 0;我
//如果字符为大写
如果
(s [i]> =
'一种'
和S[我]< =
'Z'
){
Currentsum ++;
}
// 除此以外
别的
Currentsum--;
//如果Currsum是o
如果
(Currentsum == 0)
res ++;
//如果当前的总和存在
// hashmap prevsum
如果
(Prevsum.find(Currentsum)
!= prevsum.end()){
//递增结果
//计数1
Res + =(Prevsum [Currentsum]);
}
//更新频率
//当前总和1
Prevsum [Currentsum] ++;
}
//返回结果计数
//子阵列
返回
res;
}
//驱动程序代码
int
main ()
{
string s =
“极客”
;
cout << countsubstring(s,s.length());
返回
0;
}
|
输出:
3.
时间复杂性:上)
辅助空间:O(1)
注意读者!现在不要停止学习。掌握与竞争性规划的所有重要数学概念CP课程的基本数学以学生友好188bet2021欧洲杯的价格。要完成您的准备,请从学习语言到DS ALGO等等,请参阅完成面试准备课程金宝搏188beat。