#1039 : 字符消除

题目链接

消除函数

string eliminate(string buffer)
{
    string tmpbuff = buffer;
    int len;
    int len2;
    int index, start, end;
    bool isSame = false;

    end = 0;
    index = 0;
    len = buffer.length();

    while (end < len)
    {
        /* 此时 start指向上一个以处理的字符,end指向下一个待处理的字符 */
        start = end;
        end++;

        /* start已经是最后一个了 */
        if (end == len)
        {
            buffer.at(index) = tmpbuff.at(start);
            index++;
            continue;
        }

        /* 2个相邻字符不一样 */
        else if (tmpbuff.at(end) != tmpbuff.at(start))
        {
            buffer.at(index) = tmpbuff.at(start);
            index++;
            continue;
        }

        /* 2个相邻字符一样 */
        else
        {
            /* 找下一个不一样的字符 */
            while((end != len) && (tmpbuff.at(start) == tmpbuff.at(end)))
            {
                end++;
            }
        }
    }

    buffer.resize(index);

    return buffer;
}

最开始想的是,插入的字符一定要和前或者后的一样,结果发现一直有错。仔细想想,比如ACBCCCA的情况,应该在CC和C之间插入B。

int main(void)
{
    int strNumber;
    int initialStrLength, ultimaStrLength;
    string strBuffer, tmpBuffer;
    string insertString= "ABC";

    cin >> strNumber;
    cin.ignore();

    for (int i = 0; i < strNumber; i++)
    {
        getline(cin, strBuffer);

        initialStrLength = strBuffer.length();
        ultimaStrLength = initialStrLength;
        for (int j = 0; j < initialStrLength; j++)
        {
            tmpBuffer = strBuffer.substr(0,j + 1);
            tmpBuffer += strBuffer.substr(j, strBuffer.length() - j);

            int len = tmpBuffer.length();
            tmpBuffer = eliminate(tmpBuffer);
            while (len > tmpBuffer.length())
            {
                len = tmpBuffer.length();
                tmpBuffer = eliminate(tmpBuffer);
            }

            if(ultimaStrLength > tmpBuffer.length())
            {
                ultimaStrLength = tmpBuffer.length();
            }
        }

        cout << initialStrLength - ultimaStrLength + 1 << endl;
    }

    return 0;
}
时间: 2024-11-10 14:31:11

#1039 : 字符消除的相关文章

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

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

hihoCoder - 1039 - 字符消除 (模拟题~)

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

hihocoder #1039 : 字符消除 ( 字符串处理类 ) 好久之前做的题目,具体的算法代码中阅读吧

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

hihoCoder 1039 字符消除

题目来源:字符消除 解题思路: 1.在给定字符串中的任意位置插入'A'.'B'.'C'中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度: 2.在计算字符消除后最短长度时,智能一遍一遍的计算,个人没有想出什么更好地方法 3.记录每次插入一个字符后经过第2步计算后最短的字符串长度min,最后原字符串的长度-min+1. 具体算法(java版,可以直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 public s

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

http://hihocoder.com/problemset/problem/1039 因为字符串只由3种字母组成,并且插入的字符也只能是这三种字符的其中一个,那么可以考虑枚举这三个字符其中一个字符到字符串中任意一个位置.如果可以消除则不断消除,最后更新求得一个最大值. 首先介绍这个函数  substr    substr(start,length);  返回一个从指定位置开始,并具有指定长度的字符串. start 必选.所需子字符串的起始位置,字符串的第一个字符的索引为0. length可选

算法练习系列—hiho1039 字符消除

题目地址:http://hihocoder.com/problemset/problem/1039 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和&

字符消除 字符串处理

时间限制:1000ms 单点时限:1000ms 内存限制:256MB 这个题 题意好懂,想想挺简单的,但是代码不好敲. 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下&qu

【hihocoder】字符消除

package Lv1; import java.util.*; public class 字符消除 { // f(s):返回消除s连续相同字符的个数 private static int f(String s) { int ans = 0; StringBuffer sb = new StringBuffer(s); while (!different(sb.toString())) {//这个循环是如果还有连续的重复子串 那就接着消除 for (int i = sb.length() - 1

[HIHO1039]字符消除(字符串,枚举,模拟)

题目链接:http://hihocoder.com/problemset/problem/1039 思路:枚举所有字符更新的位置和ABC三种修改方案,之后再模拟消除规则,一步一步去消除.直到无法消除,用原串长度减去当前串长度,更新答案.竟然写了好久. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃