【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; i > 0; i--) {//这里需要倒着消除  和序号有关系  这里利用了可变数组的消除
                if (sb.charAt(i) == sb.charAt(i - 1)) {// 出现了重复子串
                    int j = i - 1;

                    while (j > 0 && sb.charAt(j) == sb.charAt(i))//一旦i出现了重复子串 那么就是使用j去遍历全部的连续的字符
                        j--;
                    //所有分开了两个情况讨论
                    if (j == 0 && sb.charAt(0) == sb.charAt(i)) {// 直接去到0的话   这里有一个边界的问题
                        sb = sb.delete(j, i + 1);
                        ans += (i + 1) - j;
                        break;
                    }
                    sb = sb.delete(j + 1, i + 1);
                    ans += (i + 1) - (j + 1);
                    i = j + 1;// 之后还有i--

                }
            }
        }

        return ans;
    }

    // different(s): 判断是否有连着的相同的
    private static boolean different(String s) {
        // 因为只有ABC 所以只要判断AA BB CC 这样的子串是否存在
        // 如果存在返回false
        if (s.contains("AA"))
            return false;
        if (s.contains("BB"))
            return false;
        if (s.contains("CC"))
            return false;

        return true;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=Integer.parseInt(sc.nextLine().trim());
        String[] ss=new String[n];
        for(int i=0;i<n;i++){
            ss[i]=sc.nextLine().trim();
        }

        for(int i=0;i<n;i++){

            int max=Integer.MIN_VALUE;
            for(int j=0;j<=ss[i].length();j++){//各个位置插入
                for(char k=‘A‘;k<=‘C‘;k++){
                    StringBuffer sb=new StringBuffer(ss[i]);
                    sb=sb.insert(j, k);
                    int t=f(sb.toString());
                    max=Math.max(max, t);

                }

            }

            System.out.println(max);
        }

    }
}

原文地址:https://www.cnblogs.com/Rowry/p/10660306.html

时间: 2024-10-29 09:56:35

【hihocoder】字符消除的相关文章

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 - 字符消除 (模拟题~)

#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"和

算法练习系列—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 1039字符消除 (字符串处理)

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

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

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

#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; e