@yexiaoqi
2022-06-03T22:49:43.000000Z
字数 1222
阅读 1010
刷题 华为机试
题目:有一种简易压缩算法,针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如字符串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();}}