CF1606A AB Balance 题解
赛时唯一做出来的题,这题水过了其它都不会做。/ll
题意
给你一个由a
和b
组成的字符串 ,改变其中一个字符(变a
为b
,变b
为a
)使得其中AB
子串的数量和BA
子串的数量相等。
思路
看到 的长度不超过 ,考虑大暴力。
枚举每一个字符,计算变换该字符后AB
和BA
的个数。如果相等,输出这个变换后的字符串;反之把字符串改回原样继续枚举下一个字符。
代码
string s;
int ab,ba;
ab=ba=0;
cin>>s;
s+='L';
这一部分是输入,在字符串后面加一个L
的目的是为了防止枚举最后一个字符的时候越界。当然你也可以通过改变枚举范围避免越界。
for(int i=0;i<s.length();i++){
if(s[i]=='a'&&s[i+1]=='b'){
ab++;
}
if(s[i]=='b'&&s[i+1]=='a'){
ba++;
}
}
if(ab==ba){
s[s.length()-1]=' ';
cout<<s<<endl;
return;
}
第一次统计两种子串的个数,如果相等直接输出这个字符串,注意我们刚刚多加了一个L
,要把L
改成空格让评测机忽略(还不如直接加空格或者改变范围)。
for(int i=0;i<s.length();i++){
if(s[i]=='a'){
s[i]='b';
}
else{
s[i]='a';
}//改变字符
ab=ba=0;
for(int i=0;i<s.length();i++){
if(s[i]=='a'&&s[i+1]=='b'){
ab++;
}
if(s[i]=='b'&&s[i+1]=='a'){
ba++;
}
}//统计
if(ab==ba){
s[s.length()-1]=' ';//把L去掉
cout<<s<<endl;
return;
}
else{
if(s[i]=='a'){
s[i]='b';
}
else{
s[i]='a';
}
}//要改变回去
}
接下来枚举每一个字符,对它进行变换,每次变换之后统计AB
与BA
的个数,相等就变L为空格输出,否则把这个字符改回原样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?