1、题目如下

我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发现拼写错误的捷径:

 

1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello

2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello

3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC

 

我特喵是个天才!我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!

……

万万没想到,我被开除了,临走时老板对我说: “做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。一行行行行行;要是不行,干一行不行一行,一行不行行行不行。” 我现在整个人红红火火恍恍惚惚的……

2、输入描述 

第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。

后面跟随N行,每行为一个待校验的字符串。

3、输出描述 

N行,每行包括一个被修复后的字符串。

4、输入例子 

 

输入例子1:

2
helloo
wooooooow
 

输出例子1:

hello
woow

题解: 

首先要读懂题目的含义,意思是说叫我们自己输入多少个字符串,然后就是把几个字符串进行分别接收判断。

输入的字符串用一个字符串数组进行接收。一定要盯准题目中的约束条件。(AABB、AAA这种类型)

下面贴出详细的代码解析

package com.yuanfeng.test;/**
 * Created by yuanfeng on 2019/7/11 10:51
 */

import java.util.Scanner;

/**
 *@ClassName Main
 *@Description T0D0
 *@Author yuanfeng
 *@Date 2019/7/11 10:51
 *@Version 1.0
 **/
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //N个输入
        int N = sc.nextInt();
        String[] strings = new String[N];
        for (int i = 0; i < N; i++) {
            strings[i] = sc.next();
        }
        ValidateString solution = new ValidateString();
        //满足N行,返回每次被修复过后的N行字符串
        for (String str : strings)
            System.out.println(solution.solve(str));
    }
}
class ValidateString {
    public String solve(String s) {
        //如果字符串为空或者长度小于等于2就不需要检查,就是先判断临界条件
        if (s == null || s.length() <= 2) return s;
        //遍历字符串
        for (int i = 0; i < s.length() - 3; i++) {//这里长度减去3是因为防止字符串长度越界
            //分为两种情况判断AABB,AAA
            if (s.charAt(i) == s.charAt(i + 1) && s.charAt(i + 2) == s.charAt(i + 3)) {//AABB
              // 截取为AAB形式
                s = delete(s, i + 2);
                i--;//因为后面删除了部分字符返回的字符串s的长度变了,所以这个时候要考虑前面的s.charAt()-3这个条件是否满足,所以i--才满足条件
            }
            else if(s.charAt(i) == s.charAt(i + 1) && s.charAt(i) == s.charAt(i + 2)){//AAA
                s = delete(s,i);
                i--;//同理
            }
        }
        int n = s.length();
        if(s.charAt(n - 1) == s.charAt(n - 2) && s.charAt(n - 1) == s.charAt(n - 3))//可能结尾剩余3个AAA的情况
            s = delete(s,n-1);
        return s;
    }
    private String delete(String s, int i) {
        //截取AA,再截取B
        return s.substring(0, i) + s.substring(i + 1);
    }
}

分析一下:对于传入的字符串进行非空条件等的判断,第一个if,如果出现该问题直接返回就行了。

后者通过for循环遍历字符串,先判读AABB这种重叠词的类型,如果有就进行截取删除后者的一个,然后返回新的字符串。

第二个if同理,其中的i--部分可以详细看看,特别是其中的s.length()-3这个约束条件需要注意一下。

最后结尾剩余的AAA这种要再判断一下 前面不是减掉了3个吗 所以就少了三个呀 肯定要判断一次了!