Java字符串压缩(两种压缩方式)

举报
负债程序猿 发表于 2022/02/18 23:22:11 2022/02/18
【摘要】 第一种,只统计字符出现次数,比如aabcccccaaa,压缩成a5b1c5 思路:利用hashMap键的唯一性 public static String doDepressTwo(String...

第一种,只统计字符出现次数,比如aabcccccaaa,压缩成a5b1c5

思路:利用hashMap键的唯一性

    public static String doDepressTwo(String str) {
        if ("".equals(str)) return str;
        char[] chars = str.toCharArray();
        HashMap<Character, Integer> map = new HashMap<>();
        for (char c : chars) {
            if (map.containsKey(c)) {
            	//如果存在该键,则只需要value+1
                Integer integer = map.get(c);
                map.put(c, ++integer);
            } else {
            	//如果不存在该键,就直接放入,value为1
                map.put(c, 1);
            }
        }
        StringBuilder sb = new StringBuilder();
        map.entrySet().forEach(entry -> {
        	//将key和value拼接到sb
            sb.append(entry.getKey()).append(entry.getValue());
        });
        return sb.toString();
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

第二种,统计相邻字符串出现次数,比如aabcccccaaa,压缩成a2b1c5a3

思路:需要维护一个当前对比字符,一个字符出现次数,用第n个字符去和第n+1个字符对比,相等则出现次数+1,不相等则拼接在字符串后面

    public static String doDepress(String str) {
        //字符串为空直接返回
        if ("".equals(str)) return str;
        StringBuilder buffer = new StringBuilder();
        //用第n个字符去和第n+1个字符对比
        char c = str.charAt(0);
        //记录字符出现次数,默认为1
        int repeat = 1;
        for (int i = 1; i < str.length(); i++) {
            if (c == str.charAt(i)) {
                //如果第n个字符和第n+1个字符相等,则出现次数+1
                repeat++;
            } else {
                //如果第n个字符和第n+1个字符不相等,则拼接在字符串后面
                buffer.append(c).append(repeat);
                //拼接完后重置当前字符串
                c = str.charAt(i);
                //重置字符出现次数
                repeat = 1;
            }
        }
        //最后一组在for循环里是没有拼接的
        return buffer.append(c).append(repeat).toString();
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

测试:

    public static void main(String[] args) {
        log.info("唱跳rap的蔡徐鸡========>{}", doDepress("唱跳rap的蔡徐鸡"));
        log.info("唱跳raaaaap的的蔡徐鸡==>{}", doDepress("唱跳raaaaap的的蔡徐鸡"));
        log.info("aabcccccaaa=========>{}", doDepress("aabcccccaaa"));

        log.info("唱跳rap的蔡徐鸡========>{}", doDepressTwo("唱跳rap的蔡徐鸡"));
        log.info("唱跳raaaaap的的蔡徐鸡==>{}", doDepressTwo("唱跳raaaaap的的蔡徐鸡"));
        log.info("aabcccccaaa=========>{}", doDepressTwo("aabcccccaaa"));
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:

唱跳rap的蔡徐鸡========>唱1跳1r1a1p1的1蔡1徐1鸡1
唱跳raaaaap的的蔡徐鸡==>唱1跳1r1a5p1的2蔡1徐1鸡1
aabcccccaaa=========>a2b1c5a3
唱跳rap的蔡徐鸡========>p1徐1唱1a1蔡1鸡1r1跳1的1
唱跳raaaaap的的蔡徐鸡==>p1徐1唱1a5蔡1鸡1r1跳1的2
aabcccccaaa=========>a5b1c5

文章来源: huangjie.blog.csdn.net,作者:负债程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:huangjie.blog.csdn.net/article/details/114308084

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。