作者:云小逸
个人主页:云小逸的主页
Github:云小逸的Github
motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==
专栏:C++ 专栏:Java语言专栏:Linux学习
专栏:C语言初阶专栏:数据结构专栏:备战蓝桥杯
今天这篇文章我们学习双指针,这次要讲解双指针的经典问题:字符串删减。码字不易,请多多支持!
——————————————————————————————
给定一个由 n 个小写字母构成的字符串。
现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x。
请问,最少需要删掉多少个字母?
如果字符串本来就不存在连续的三个或三个以上 x,则无需删掉任何字母。
第一行包含整数 n。
第二行包含一个长度为 n 的由小写字母构成的字符串。
输出最少需要删掉的字母个数。
3≤n≤100
6
xxxiii
1
5
xxoxx
0
10
xxxxxxxxxx
8
从题意中我们可以知道我们一定不会删除之外的字符
从下图可以知道如果存在多段子串,那它们必是独立的
这样我们就可以分别考虑它们了,分别计算出它们要删减的字符个数,最终计算即可:
对于某一段进行讨论:
K<3,不需要删减;
K>=3,删减K-2个字符。
计算每一段的长度,那就需要用到双指针了
首先从第一个数字开始,不是X则下一个,是X则从它开始计数,直到第一个不是X的数即可。
#include
#include
#include
using namespace std;
int n;
int main()
{
int n;
string str;
cin >> n >> str;
int res = 0;
for (int i = 0; i < n; i ++ )//从开始枚举,
if (str[i] == 'x')//当遇到第一个为x的时候,计数
{
int j = i + 1;
while (j < n && str[j] == 'x') j ++ ;
res += max(j - i - 2, 0);//j-i-2是要删减字符的个数
i = j - 1;
}
cout << res << endl;
return 0;
}
for (int i = 0; i < n; i ++ )//从开始枚举,
if (str[i] == 'x')//当遇到第一个为x的时候,计数
{
int j = i + 1;
while (j < n && str[j] == 'x') j ++ ;
res += max(j - i - 2, 0);//j-i-2是要删减字符的个数
i = j - 1;
}
十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:
1.应该是从喜欢里得到力量和快乐,而不是花光了力量和快乐去喜欢。
2.一定要狠下心来努力变成一个很厉害的人,厉害到有一天,你可以随时离开那些令你不舒服的圈子和人,让他们通通羡慕不已。你在四五月做的事情,在八九月自然会有答案。
3.你一定要努力,当你接触优秀的人时,你会发现别人不仅有钱,还穿的好看,打扮时尚,阳光且温柔,自律且上进,各方面都很优秀。
难熬的日子总会过去的,不信你回头看看,你都已经在不知不觉中熬过了很多苦难,所以真的不必慌张。
4.该翻脸的时候就翻脸,你好说话他还以为你好说话,过分的善良只会让人觉得你没有价值,他会得寸进尺的欺负你,你还要对他低声下气,难道他就天生富贵高人一等吗?
你不敢翻脸,是你自卑懦弱无能,对于不尊重你,不理解你的人,别客气。
5.你讨厌父亲的平庸,却不知道,他也曾是个怀揣梦想的少年。
你嫌弃母亲的唠叨,却不记得,她也曾是个对镜贴花黄的姑娘。
你是第一次当孩子,他们也是第一次当父母。世界上没有那么多极端可恶或者完美无缺的父母,他们也只是有着各种缺点的普通人而已。
不必总是想原生家庭欠了我什么,恰恰是原生家庭帮助我们看清自己修补自己,而非用来怨恨。毕竟,我们终其一生都要为自己负责。
最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)
愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!