[关闭]
@yexiaoqi 2022-06-03T22:49:43.000000Z 字数 1222 阅读 627

62. 一种字符串压缩表示的解压

刷题 华为机试


题目:有一种简易压缩算法,针对全部为小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如字符串aaabbccccd 经过压缩变成字符串 3abb4cd。请您编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串,若输入合法则输出解压缩后的字符串,否则输出字符串"!error"来报告错误

输入描述
输入一行,为一个ASCII字符串,长度不超过100字符
用例保证输出的字符串长度也不会超过100字符串

输出描述
若判断输入为合法的经过压缩后的字符串,则输出压缩前的字符串
若输入不合法 则输出字符串"!error"

示例

输入:4dff
输出:ddddff
说明:4d扩展为4个d ,故解压后的字符串为ddddff

输入:2dff
输出:!error
说明:2个d不需要压缩 故输入不合法

输入:4d@A
输出:!error
说明:全部由小写英文字母做成的字符串,压缩后不会出现特殊字符@和大写字母A,故输入不合法

输入:22aa
输出:!error

  1. import java.util.*;
  2. import java.util.regex.Pattern;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. String s = sc.next();
  7. //字符匹配:非法字符、类似“2aa”、类似“aaa”、以数字结尾的情况
  8. if (find(s,"[^0-9a-z]+") || find(s,"[0-9]([a-z])\\1") || find(s,"([a-z])\\1{2,}") || find(s,"[0-9]+$")){
  9. System.out.println("!error");
  10. return;
  11. }
  12. StringBuilder sb = new StringBuilder();
  13. for (int i = 0; i < s.length(); i++) {
  14. char c = s.charAt(i);
  15. if (Character.isLetter(c))
  16. sb.append(c);
  17. else {
  18. int start = i;
  19. while (Character.isDigit(s.charAt(++i))) {}
  20. int n = Integer.parseInt(s.substring(start, i));
  21. if (n == 2) {//计数匹配
  22. System.out.println("!error");
  23. return;
  24. }
  25. for (int j = 0; j < n; j++)
  26. sb.append(s.charAt(i));
  27. }
  28. }
  29. System.out.println(sb);
  30. }
  31. //正则部分匹配
  32. private static boolean find(String s, String regular) {
  33. return Pattern.compile(regular).matcher(s).find();
  34. }
  35. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注