@yexiaoqi
2022-06-04T06:49:43.000000Z
字数 1222
阅读 767
刷题
华为机试
题目:有一种简易压缩算法,针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如字符串aaabbccccd 经过压缩变成字符串 3abb4cd。请您编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串,若输入合法则输出解压缩后的字符串,否则输出字符串"!error"来报告错误
输入描述
输入一行,为一个ASCII字符串,长度不超过100字符
用例保证输出的字符串长度也不会超过100字符串
输出描述
若判断输入为合法的经过压缩后的字符串,则输出压缩前的字符串
若输入不合法 则输出字符串"!error"
示例
输入:4dff
输出:ddddff
说明:4d扩展为4个d ,故解压后的字符串为ddddff
输入:2dff
输出:!error
说明:2个d不需要压缩 故输入不合法
输入:4d@A
输出:!error
说明:全部由小写英文字母做成的字符串,压缩后不会出现特殊字符@和大写字母A,故输入不合法
输入:22aa
输出:!error
import java.util.*;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
//字符匹配:非法字符、类似“2aa”、类似“aaa”、以数字结尾的情况
if (find(s,"[^0-9a-z]+") || find(s,"[0-9]([a-z])\\1") || find(s,"([a-z])\\1{2,}") || find(s,"[0-9]+$")){
System.out.println("!error");
return;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isLetter(c))
sb.append(c);
else {
int start = i;
while (Character.isDigit(s.charAt(++i))) {}
int n = Integer.parseInt(s.substring(start, i));
if (n == 2) {//计数匹配
System.out.println("!error");
return;
}
for (int j = 0; j < n; j++)
sb.append(s.charAt(i));
}
}
System.out.println(sb);
}
//正则部分匹配
private static boolean find(String s, String regular) {
return Pattern.compile(regular).matcher(s).find();
}
}