首页 > 解决方案 > 反向编码字符串

问题描述

我正在寻求有关如何反转我的代码的帮助,以便输入'A2B5C2'会给我输出'AABBBBBCC',有什么建议吗?

谢谢

public static void printRLE(String str) {
    int n = str.length();
    for (int i = 0; i < n; i++) {
        // Count occurrences of current character
        int count = 1;
        while (i < n - 1 && str.charAt(i) == str.charAt(i + 1)) {
            count++;
            i++;
        }
        // Print character and its count
        System.out.print(str.charAt(i));
        System.out.print(count);
    }
}

public static void main(String[] args) {
    String str = "AABBBBBCC";
    printRLE(str);
}

标签: java

解决方案


为了得到这种情况,数字将超过 9,我建议使用一个简单的正则表达式来匹配letter+number,然后将字母重复您需要的次数:

static String getRevRLE(String str) {
    StringBuilder res = new StringBuilder();
    Matcher m = Pattern.compile("([a-zA-Z][0-9]+)").matcher(str);
    while (m.find()) {
        String g = m.group();
        res.append(g.substring(0, 1).repeat(Integer.parseInt(g.substring(1))));
    }
    return res.toString();
}

使用StreamsAPI,您可以减少到

static String getRevRLE(String str) {
    return Pattern.compile("([a-zA-Z][0-9]+)").matcher(str).results()
                  .map(MatchResult::group)
                  .map(g -> g.substring(0, 1).repeat(Integer.parseInt(g.substring(1))))
                  .collect(Collectors.joining());
}

测试

public static void main(String[] args) {
    String str = "AABBBBBCCCCCCCCCCCCCCCCCCCC";
    String rle = getRLE(str);
    String res = getRevRLE(rle);
    System.out.println(res + " " + res.equals(str)); // AABBBBBCCCCCCCCCCCCCCCCCCCC true
}

推荐阅读