来源:牛客网
题目描述
小红定义一个字符串是好串,当且仅当该字符串任意一对相邻字符都不同。
现在小红拿到了一个01串,请你帮小红求出有多少个长度不小于2的连续子串是好串。
输入描述:
一个长度不超过200000的字符串,仅由'0'和'1'组成。
输出描述:
输出相邻字符均不同的连续子串数量。
示例1
输入
复制01011
01011
输出
复制6
6
说明
有2个"01"子串,1个"10"子串,1个"010"子串,1个"101"子串,1个"0101"子串。
思路:将读取的长字符串切割为若干个长好串,长好串的所有字串均为好串,所以问题就转化成了求所有长好串的子串和。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long cnt=0,t=0;
string s;
cin>>s;
for(long long i=0;i<s.size()-1;i++) //单步循环遍历字符串
{
if(s[i]!=s[i+1]) //判定是否为好串
{
t++;//记录本段好串最大长度 ,本串的所有子串均为好串(第一个字符t为0)
if(i==s.size()-2)//串遍历结束,则最后一段好串判定结束,提前计算子串数
{
cnt+=(1+t)*t/2;
}
}
else
{
cnt+=(1+t)*t/2;//(例:一段好串含6个字符,则该段好串t值为5,则含(1+t)*t/2个子串,(等差数列求和))
t=0;//上一段好串计算结束,重置t值开始计算下一段好串
}
}
cout<<cnt;
return 0;
}
博主自己也是算法小白,解释不清或代码可优化处欢迎评论交流