hihoCoder 1039:字符消除(字符串处理)

简介: #1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:   1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。

#1039 : 字符消除

时间限制: 1000ms
单点时限: 1000ms
内存限制: 256MB

描述

小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
题目链接:https://hihocoder.com/problemset/problem/1039
好吧,这题本身就是一道谷歌公司的面试题,虽然难度等级LV1,但。。。还是好难!!!
这道题思路是:在原字符串上的每个位置添加上A或B或C,然后去消除。因为字符串只由3种字母组成,并且插入的字符也只能是这三种字符的其中一个,那么可以考虑枚举这三个字符其中一个字符到字符串中任意一个位置。如果可以消除则不断消除,最后更新求得一个最大值。 这道题我不得不介绍一种函数-insert,在原有的字符串上插入一个字符!就是选定第i个位置,在第i个位置之后插入一个字符!函数写法为temp(字符串).insert(i,"某一字符");
下面给出AC代码:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 string s;
 4 int del(string p)//每次执行,字符就会消除一次,直到不能消除为止
 5 {
 6     int len=p.size();
 7     int lent;
 8     if(len==0) return 0;//结束条件
 9     string t="";//删除后剩余的加到t上
10     int l=0;
11     p+="#";//加一个标志位
12     for(int i=1;i<=len;i++)
13     {
14         if(p[i]!=p[i-1])
15         {
16             if(l==i-1) t+=p[i-1];
17             l=i;
18         }
19     }
20     if((lent=t.size())==len) return 0;//结束条件
21     return len-lent+del(t);
22 }
23 int main()
24 {
25     int T;
26     while(scanf("%d",&T)!=EOF)
27     {
28         while(T--)
29         {
30             cin>>s;
31             int ans=0,t;
32             int len=s.size();
33             for(int i=0;i<=len;i++)
34             {
35                 string temp=s;
36                 temp.insert(i,"A");
37                 if((t=del(temp))>ans) ans=t;
38                 temp=s;
39                 temp.insert(i,"B");
40                 if((t=del(temp))>ans) ans=t;
41                 temp=s;
42                 temp.insert(i,"C");
43                 if((t=del(temp))>ans) ans=t;
44             }
45             cout<<ans<<endl;
46         }
47     }
48     return 0;
49 }

 

目录
相关文章
|
5月前
|
算法 C语言 开发者
C语言精确统计字符串中的神秘字符
C语言精确统计字符串中的神秘字符
35 0
|
11月前
|
数据采集 Java 机器人
根据正则表达式截取字串符,这个办法打败99%程序员
作为一名程序员,常常会在以下情况下使用函数功能根据正则表达式截取字符串:
|
12月前
|
C语言
【Leetcode-1638.统计只差一个字符的字串数目(C语言)】
【Leetcode-1638.统计只差一个字符的字串数目(C语言)】
41 0
|
4月前
|
安全 JavaScript Swift
Swift开发——输出格式化字符
这篇文章介绍了Swift语言的基本概念和格式化输出方法。Swift是苹果平台的官方编程语言,强调类型安全,使用`main.swift`作为程序入口。文章通过示例展示了如何使用`print`函数进行格式化字符串输出,包括控制整数和浮点数的宽度、对齐方式以及使用`String(format:)`函数。示例代码创建了一个名为Ch0001的工程,并展示了不同输出方式,如常规输出、格式化输出和使用`\(`常量名或变量名`)`的形式。最后,文章给出了程序的运行结果截图。
44 0
Swift开发——输出格式化字符
|
5月前
|
测试技术
【错题集-编程题】添加字符(字符串)
【错题集-编程题】添加字符(字符串)
|
5月前
|
编译器 C++
【C++14保姆级教程】数位分割符、函数返回值推导
【C++14保姆级教程】数位分割符、函数返回值推导
|
11月前
|
算法 搜索推荐 程序员
C语言第十六练——数字组合匹配
C语言第十六练——数字组合匹配
100 0
|
12月前
|
存储 算法
【每日挠头算法题(5)】重新格式化字符串|压缩字符串
【每日挠头算法题(5)】重新格式化字符串|压缩字符串
|
12月前
|
存储 C语言 索引
C语言—统计一串字符中各个字符的出现频率
本文就如何统计一串字符串中全部字符出现的次数为例简单介绍了实现思路并给出了程序设计。
196 0
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #