2254B B
来源:Codeforces ★ 900
本题活力0.26按难度、完成结果与训练证据估算
算法如山行则将至
题目描述
删除一个中间字符后,求压缩字符串的最小长度。
思考与重做
王梓豪的同题记录 · 1 条
- 王梓豪 · 2026-08-05本次记录最后更新 2026.8.5
完成结果:未记录
简单题,想想就有了
队友同题 · 2 人2 条记录
完成结果:未记录
尚无心得记录
完成结果:未记录
先统计原字符串的连续段数量num,然后考虑删除第i个字符:1.如果s[i]与左边或右边字符相同,则删除它不会使这一段消失,因此默认初始化del=0。2.如果s[i]与左右字符都不同说明s[i]自己单独构成一段,这里分两种情况,如果左右字符相同,那么删掉s[i]后左右可以继续合并,所以del=2,如果左右字符不同,则del=1。 最后用num-del得到答案
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{int n;
cin>>n;
string s;
cin>>s;
bool flag=false;
for(int i=1;i<s.length()-1;i++)
{
if(s[i-1]==s[i+1]&&s[i]!=s[i-1])
{
flag=true;
break;
}
}
int cnt=1;
for(int i=0;i<s.length()-1;i++)
{
if(s[i]!=s[i+1])
cnt++;
}
if(flag)
cnt-=2;
else
{
for(int i=1;i<s.size()-1;i++)
{
if(s[i]!=s[i+1]&&s[i]!=s[i-1])
{
cnt--;
break;
}
}
}
cout<<cnt<<endl;
}
}