hihoCoder--1039:字符消除
描述
小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:
1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。
2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"
游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。
请帮助小Hi计算要如何插入字符,才能获得最高得分。
输入
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。
输出
对于每一行输入的字符串,输出小Hi最高能得到的分数。
提示
第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。
第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。
第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。
样例输入
3 ABCBCCCAA AAA ABC
样例输出
9 4 2
解题思路
暴力法:在每个位置尝试插入A,B,C字符,计算当前字符串的得分,并记录最大得分。
AC代码
#include <iostream>
#include <string>using namespace std;//得到字符串str的得分
int getScore(string str) {//cout << str << endl;int score = 0;size_t oldlen = str.size(); //记录原始字符串的长度string new_str;//当原始字符串与新字符串长度相同时,表示没有可删除的字符,结束循环while (oldlen != new_str.size()) {oldlen = str.size();new_str.erase(0, new_str.size());size_t i = 0;//删除重复的字符串,并更新得分,将未重复的字符加入new_strwhile (i < str.size()) {if (str[i] == str[i+1]) {while (i < str.size() && str[i] == str[i+1]) {++score;++i;}++score;++i;} elsenew_str += str[i++];}//cout << new_str << endl;str = new_str;}return score;
}//得到字符串在添加一个字母后的最大得分
int getMaxScore(string &str) {char selectedSet[] = {'A', 'B', 'C'};int maxscore = 0;//在每个位置尝试插入A, B, Cfor (size_t i = 0; i < str.size(); ++i) {for (int j = 0; j < 3; ++j) {str.insert(i+1, 1, selectedSet[j]);int score = getScore(str);maxscore = max(score, maxscore);str.erase(i+1, 1);}}return maxscore;
}int main()
{int Totalnum;cin >> Totalnum;for (int i = 0; i < Totalnum; ++i) {string str;cin >> str;cout << getMaxScore(str) << endl;}return 0;
}
雷区
误区1:审题不清!!!
相邻字符消除,马上想到栈,将字符串从前到后依次入栈,每次加入新的字符时,判断当前字符与栈顶元素是否相同,如果相同,判断当前字符与其相邻的后面的字符是否相同,更新得分,弹栈,当遍历完整个字符串时,即可得到结果。
该题是先将当前字符串中相邻的相同字符删除,不断得到新的字符,不断重复删除步骤直至不能继续删除。
ABCCBCCCAA ,删除CC,CCC,AA,得到 ABB,删除BB,得到A 得分为9
如果每个元素依次入栈则为
ABCC,删除CC,得ABB,删除BB,得ACCC,删除CCC,得AAA,删除AAA,最后得到空字符串,得分为10
本题也可以用栈,但是需要所有的字符先入栈,然后不断弹出栈顶,将相同的相邻字符删除,其他字符压入新的栈,重复该过程,直至存放字符串的栈的大小不再改变。如果这样的话,不如直接用两个字符串,不断遍历字符串,将未删除的字符保存在new_str中,如果删除前和删除后字符串长度未发生改变,表示无法再删除,返回得分。
误区2:想当然,耍小聪明!!!
自以为只要在字符串中,相邻字符不同的位置插入前一个字符即可,保证每次的插入都要消除一个原字符串中不能消除的值,同时减少插入的次数。
实际上插入的字符有时候并不是在第一次删除过程中就起作用,在第二次或之后的删除中才能发挥更大的作用。
只在相邻字母不同的位置插入字符,结果为WA
如果换成在所有可能插入的位置尝试插入A, B, C时,AC
总结
不要耍小聪明,先理解清楚题意,考虑所有可能情况,不要想当然。通过之后再想办法优化。
hihoCoder--1039:字符消除相关推荐
- hihoCoder 1039:字符消除(字符串处理)
#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消 ...
- 1039 字符消除 java_Hihocoder 1039 字符消除
描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除, ...
- 【hihocoder 1039 字符串消除】模拟
题目链接:http://hihocoder.com/problemset/problem/1039 题意:给定一个只由{A, B, C}组成的字符串s,长度为n, 故包含n+1个空隙:现要求在某个空隙 ...
- hihoCoder #1902 字符替换
解法 这题比赛时过的人很多,我却没思路,糊里糊涂写了个强联通分量,得了 80 分. 这题思路是这样的. 一个替换操作可以看做一个有向边,所以题目实际上给出了一个有向图 $G$,一个节点代表一个字母. ...
- afe 高通_高通ASOC中的machine驱动
ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:Machin ...
- 2016/11/27月赛总结
比赛链接:点这里 密码:ACM7114 题目: C - The calculation of GPA Time Limit:1000MS Memory Limit:32768KB 6 ...
- 第二次月赛总结(11.27)
C -The calculation of GPA Description 每学期的期末,大家都会忙于计算自己的平均成绩,这个成绩对于评奖学金是直接有关的.国外大学都是计算GPA(grade poin ...
- vb中mschart利用数组作图_选考VB算法解析之2019年4月高考真题卷第17题
说在前面 在对数组排序时,我们常把数组分成已排序区域和待排序区域,并使用左右边界来划分待排序区域的范围:对分查找时我们也引入了左右边界的概念.可见左右边界在数组中是一个非常重要的概念,它在分段处理数组 ...
- CodeForces:1103(div1)1104(div2)
文章目录 前言 CF1104A Splitting into digits Description\text{Description}Description Solution\text{Solutio ...
最新文章
- 千万别中招!手把手教你复现Log4j2漏洞!
- android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素
- C#的多线程机制探索4
- 关于Kanas.Net框架的一些背景
- OpenCV中图像显示窗口函数namedWindow()详解
- sql自动生成工具_可自动生成代码,5款基于AI的开发工具
- 2017苏州太湖国际马拉松 半程成绩单
- 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
- nginx ngx_http_core_module(http server location)
- 使用SQL Server数据库指标预测应用程序问题
- 程序员别埋头苦干了,花时间学点薪资谈判技巧多赚一个亿可好?
- Timeline Storyteller 现已加入自定义图表库
- 目标检测之2015iccv---objdetection 专题论文
- python运维开发实战
- ssm小型超市管理系统的设计与实现毕业设计源码011136
- 英国高中A-Level和IB课程介绍
- 方差、标准差、协方差概念与意义梳理
- ERROR security.UserGroupInformation: Priviledge...
- 谷歌 Jason Wei | AI 研究的 4 项基本技能
- 搜狗搜索立知问答合作说明
热门文章
- 高斯噪音 matlab,如何给图像添加高斯噪声(MATLAB)
- 学会人际关系是网站主编的先决条件
- js将秒转化为小时和分钟的形式
- 100刮板机筒 斜带式输送机 移动式皮带机 凸轮机构设计 1.6m煤矿单滚筒提升机图纸 90°转弯输送机 皮带机伸缩装置图纸 螺杆输送机图 铝锭铸造机整体图 / 设计
- 机器学习之多模型融合预测iris数据集
- 百度前端技术学院:第二十八天到第三十天 给爱的人发个邮件吧
- 半路出家windbg(先搞清楚自己分析出来的参数都是什么意思)
- php 序列化 反序列化 __sleep __wakeup
- 江苏二本计算机科学与技术好的学校排名,江苏最好的二本学校,2021年江苏二本学校排名前十名单公布...
- kettle插入/更新的使用