【八中测试】字符消除

A - 字符消除

小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计算要如何插入字符,才能获得最高得分。

Input

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

之后T行每行一个由’A”B”C’组成的字符串s,长度不超过100。

Output

对于每一行输入的字符串,输出小Hi最高能得到的分数。

Sample Input

3
ABCBCCCAA
AAA
ABC

Sample Output

9
4
2

Hint

第一组数据:
在”ABCBCCCAA”的第2个字符后插入’C’得到”ABCCBCCCAA”,消除后得到”A”,总共消除9个字符(包括插入的’C’)。

第二组数据:
“AAA”插入’A’得到”AAAA”,消除后得到”“,总共消除4个字符。

第三组数据:
无论是插入字符后得到”AABC”,”ABBC”还是”ABCC”都最多消除2个字符。

解析

这道题的正确做法是:暴力枚举,在每一个位置分别的插入‘A B C ’ ,然后进行判断选出最优的方式。至于怎么来实现在每一个位置不断进行插入,这就需要我们使用String,当然其实也不难,重点是思路。
(Dalao下面可以忽略)
刚开始的思考并没有想到这么做,而是有另外一种想法。在字符串中先遍历一遍找到只有单个的字符,后再查询一遍,找出所有单个字符中层数最多的一个字符,再加上相同的一个即可。(如AACBB,加’C’【层数最多:2】;如ABCBABCA,加‘CA’皆可。【第四个位置上的’A’或第二个位置上的’C’】)但似乎实现起来很麻烦,所以,我们就按照正确的思路来完成吧。
实现代码:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

char in[3] = {'A', 'B', 'C'};

string getsubstring(string str) {
    int len = str.size();
    if (len <= 1) return str;
    string ss = "";//初始化;
    for (int i = 0;i < len-1;++i) {
        if (str[i] == str[i+1]) {//相邻两字符相同, 可以消除;
            while (i + 1 < len && str[i] == str[i+1]) ++i;//找到当前序列最后一个与当前字符集内的字符相同的字符;      
        }
        else ss += str[i];//ss存不相同的字符;
    }
    if (str[len-1] != str[len-2]) ss += str[len-1];//处理最后一个字符;
    return ss;//返回处理之后的字符串;
}

int main() {

    int t;
    scanf("%d",&t);
    while (t--) {
        string s;
        cin >> s;
        int max = 0;
        int len = s.size();
        string str;
        for (int i = 0;i < len-1;++i) {
            for (int j = 0;j < 3;++j) {//枚举所有字母的插入情况;
                str = s.substr(0, i+1) + in[j] + s.substr(i+1);
                //substr: 提取从指定下标开始指定长度的子串;
                int len1 = str.size();
                str = getsubstring(str);
                while (len1 > str.size()) {
                    len1 = str.size();//反复处理, 直到最后得到的字符串相邻之间的字符都不相同;
                    str = getsubstring(str);
                }
                if (s.size() - len1 + 1 > max) {
                    max = s.size() -len1 + 1;
                }
            }
        }
        printf("%d\n",max);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37862149/article/details/79444720