牛客网刷题:发现拼写错误

题目:

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

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

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

评论区骚操作

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int line = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < line; i++) {
            System.out.println(scanner.nextLine().replaceAll("(.)\\1+","$1$1").replaceAll("(.)\\1(.)\\2","$1$1$2"));
        }
    }
}

单独的正则表达式中的\1指的是第一个括号中所匹配的内容,也就是(.)所对应的字符。加号+指的是一个或多个。比如说(x)(y)\\2等价于xyy
这样连起来的话(.)\\1+代表的是:(.)对应的是任意一个字符,\\1对应的是前面第一个括号内所匹配到的字符,+对应的是\\1对应的字符有一个或多个,综合下来(.)\\1+代表的是两个或两个以上相同的字符。
$1$1指的是第一个括号内所匹配到的字符,连续两次。
所以第一个语句指的是匹配语句中所有重复两次或两次以上的字符串,将其替换为两个相同字符。
后面第二个语句也是同理。

自己的答案

package shuati;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @Author LakersHao
 * @Date 2021/2/16 13:09
 */
public class TestB {
    static Scanner sc = new  Scanner(System.in);
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        int N = sc.nextInt();
        while(N > 0 && sc.hasNext()){
            list.add(sc.next());
        }
        int ind = 0;
        while(N > 0){
            String str = list.get(ind);
            ind++;
            char ch[] = str.toCharArray();
            for(int i = 0;i<ch.length;i++){
                //int j = i+2;
                if(i+1 < ch.length && ch[i] == ch[i+1]){
                    //解决helllo
                    while(i+2 < ch.length &&ch[i+1] == ch[i+2]){
                        for(int k = i+2;k<ch.length-1;k++){
                            ch[k] = ch[k+1];
                        }
                        ch = Arrays.copyOf(ch, ch.length - 1);
                    }
                    //解决helloo
                    while(i+3 < ch.length && ch[i+2] == ch[i+3]){
                        for(int k =i+2 ;k<ch.length-1;k++){
                            ch[k] = ch[k+1];
                        }
                        ch = Arrays.copyOf(ch, ch.length - 1);
                    }
                }
            }
            System.out.println(ch);
            N = N-1;
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值