TopCoder提交测试

TopCoder网络连接不是很好,尝试了各种方法后,用Edge浏览器+全局代理连上了。似乎不用代理也可以。

  • 网址:https://arena.topcoder.com
  • 刷题点击上边栏的Practice Problem,点击题目后进入页面需要加载很长时间。如果出现Disconnect之后点继续,继续在界面等待…
  • 题目加载完成后,测试提交较为顺利。网页版编辑器机支持自定义测试。
  • 需要根据题目的要求实现相应方法。

题目:ABBA

判断一个AB组成的字符串是否可以通过末尾加A、翻转后加B变换成为另一个字符串。

一般这种字符串修改的容易想到DP。不过这道题主要方法应该是贪心。首先计算出两个字符串的AB个数差值,然后根据B的差值判断翻转的次数。可以确定原字符串经过翻转后,前后跟随的B的个数和添加A的位置。与目标字符串进行比对即可。

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;


class ABBA{
    public:
    string canObtain(string initial, string target){
        int len1 = initial.length();
        int len2 = target.length();
        int cntA = 0, cntB = 0;
        for(char a : initial){
            if(a == 'A'){
                cntA--;
            }
            else{
                cntB--;
            }
        }
        for(char a : target){
            if(a == 'A'){
                cntA++;
            }
            else{
                cntB++;
            }
        }
        if (cntB < 0 || cntA < 0) {
            return "Impossible";
        } else {
            int cntL = cntB / 2;
            int cntR = cntB - cntL;
            bool rev = cntB & 1;
            if (rev) {
                int p = len2 - 1;
                if (!cntR && initial[0] != 'A' && target[0] == 'A') return "Impossible";
                while (cntR) {
                    cntR -= target[p] == 'B';
                    p--;
                }
                if (p - len1 + 1 < 0) return "Impossible";
                for (int i = 0; i < len1; ++i) {
                    int pp = p - i;
                    if (target[pp] != initial[i]) return "Impossible";
                }
                return "Possible";
            }
            else{
                int p = 0;
                if (!cntR && initial[0] != 'A' && target[0] == 'A') return "Impossible";
                while (cntL) {
                    cntL -= target[p] == 'B';
                    p++;
                }
                if (p + len1 > len2) return "Impossible";
                for (int i = 0; i < len1; ++i) {
                    int pp = p + i;
                    if (target[pp] != initial[i]) return "Impossible";
                }
                return "Possible";
            }
        }

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值