zoukankan      html  css  js  c++  java
  • 字符消除

    字符消除

    时间限制: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
      1 package Qin.Coding3_12;
      2 
      3 import java.util.Comparator;
      4 import java.util.Scanner;
      5 import java.util.Set;
      6 import java.util.TreeSet;
      7 
      8 /**
      9  * Created by Qin on 2020/3/21.
     10  */
     11 public class LetterElimination {
     12 
     13     public static void main(String[] args) {
     14         String string ;
     15         Scanner scanner = new Scanner(System.in);
     16         int T = scanner.nextInt();
     17         String[] strings = new String[T];
     18         int A, B, C = 0;
     19         for (int i = 0; i < T; i++) {
     20             string = scanner.next();
     21             strings[i] = string;
     22         }
     23 
     24 /**
     25  * 注意:成批输入时,不能将输入循环和操作循环写在一个循环里,不然结果格式会很奇怪
     26  * 解决思路:将两个循环分开写,用一个容器作为桥梁
     27  */
     28         for (int i = 0; i < T; i++) {
     29             C = 0;
     30 
     31             string = strings[i];
     32             //输入字符串转StringBuilder
     33             StringBuilder sb = new StringBuilder(string);
     34 
     35 
     36             for (int j = 0; j < sb.length() + 1; j++) {
     37 
     38                 //插入字符“A”,"B","C"
     39                 for (int k = 0; k < 3; k++) {
     40                     switch (k) {
     41                         case 0:
     42                             sb.insert(j, "A");
     43                             break;
     44                         case 1:
     45                             sb.insert(j, "B");
     46                             break;
     47                         case 2:
     48                             sb.insert(j, "C");
     49                             break;
     50 
     51                     }
     52 
     53                     A = sb.length();
     54                     Set<Integer> set = new TreeSet(new MyComparator());
     55 
     56                     //重复消除连续重复字符
     57                     do {
     58                         set.clear();
     59                         char[] a = new char[sb.length() + 1];
     60                         sb.getChars(0, sb.length(), a, 0);
     61 
     62                         //找出连续重复字符的位置
     63                         for (int l = 1; l < a.length; l++) {
     64                             if (a[l - 1] == a[l]) {
     65                                 set.add(l - 1);
     66                                 set.add(l);
     67                             }
     68                         }
     69 
     70                         //根据索引删除所有重复字符
     71                         for (Integer x : set) {
     72 
     73                             /**
     74                              * 注意:每次删除,都会导致sb中字符位置改变
     75                              * 解决思路:从后往前删除
     76                              */
     77                             sb.deleteCharAt(x);
     78                         }
     79 
     80                         //满足条件就循环
     81                     } while (set.size() != 0);
     82 
     83                     B = sb.length();
     84                     C = Math.max(C, A - B);
     85 
     86                     //重新new StringBuilder对象
     87                     sb = new StringBuilder(string);
     88                 }
     89             }
     90 //            System.err.println(C);//为了校验数据方便,结果被坑了43分钟
     91             System.out.println(C);
     92         }
     93     }
     94 }
     95 class MyComparator implements Comparator<Integer> {
     96     @Override
     97     public int compare(Integer o1, Integer o2) {
     98         //降序排列
     99         return o2.compareTo(o1);
    100     }
    101 }
  • 相关阅读:
    springcloud有哪些特征
    可变参数
    递归
    增强的for循环
    Scanner对象
    注释
    Markdown常见的样式语法
    副本机制
    消费者分区分配策略
    SpringMVC 登陆判断
  • 原文地址:https://www.cnblogs.com/DemonQin/p/12548043.html
Copyright © 2011-2022 走看看