题目:
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;
}
}
}