• 【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最高能得到的分数。

    样例输入

    3
    ABCBCCCAA
    AAA
    ABC
    

    样例输出

    9
    4
    2
    

    参考代码

    /*
    直接暴力即可
    */
    import java.io.*;
    import java.util.*;
    
    public class Main {
    	static final int N=(int)1e5+10;
    	static boolean flag;
    	static int cnt;
    	static StringBuilder check(StringBuilder a) {
    		if(a.length()<=1) return a;
    		StringBuilder tmp=new StringBuilder("");
    		for(int i=0;i<a.length();i++) {
    			if(i==0){
    				if(a.charAt(i)!=a.charAt(i+1))  tmp.append(a.charAt(i));
    				else flag=false;
    			}
    			else if(i==a.length()-1) {
    				if(a.charAt(i)!=a.charAt(i-1)) 
    					tmp.append(a.charAt(i));
    				else flag=false;
    			}
    			else{
    				if(a.charAt(i)!=a.charAt(i+1)&&a.charAt(i)!=a.charAt(i-1)) 
    					tmp.append(a.charAt(i));
    				else flag=false;
    			}
    		}
    		cnt=a.length()-tmp.length();
    		return tmp;
    	}
    	static int solve(StringBuilder st) {
    		StringBuilder a=new StringBuilder(st);
    		int sum=0;
    		flag=true;cnt=0;
    		a=check(a);
    		sum+=cnt;
    		while(!flag){
    			flag=true;cnt=0;
    			a=check(a);
    			sum+=cnt;
    		}
    		return sum;
    	}
    	static Scanner sc=new Scanner(new InputStreamReader(System.in));
    	public static void main(String[] args){
    		int T=sc.nextInt();
    		StringBuilder ans1=new StringBuilder();
    		while(T--!=0) {
    			String str=sc.next();
    			int ans=0;
    			StringBuilder tmp=new StringBuilder(str);
    			for(int i=0;i<=str.length();i++) {
    				for(int j=0;j<3;j++) {
    					 tmp.insert(i,(char)(j+'A'));
    					 ans=Math.max(ans, solve(tmp));
    					 tmp.delete(i, i+1);
    				}
    			}
    			ans1.append(ans+"
    ");
    		}
    		System.out.print(ans1);
    		sc.close();
    	}
    }
    
  • 相关阅读:
    django学习----http协议
    线程进程和协程
    内置函数
    我所了解的递归
    函数的闭包和装饰器
    字符串的内置方法
    格式化输入输出
    逻辑运算符和操作运算符
    python流程控制
    计算机网络原理
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7230172.html
Copyright © 2020-2023  润新知