当前位置 博文首页 > 数据结构和算法:面试题 01.06. 字符串压缩

    数据结构和算法:面试题 01.06. 字符串压缩

    作者:[db:作者] 时间:2021-07-29 12:44

    截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
    下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
    提取码:6666

    在这里插入图片描述
    在这里插入图片描述
    视频链接

    再来看下代码

    public String compressString(String S) {
        //边界条件判断
        if (S == null || S.length() == 0)
            return S;
    
        StringBuilder res = new StringBuilder();
        //当前字符
        char curChar = S.charAt(0);
        //当前字符的数量
        int curCharCount = 1;
        for (int i = 1; i < S.length(); i++) {
            //如果当前字符有重复的,统计当前字符的数量
            if (S.charAt(i) == curChar) {
                curCharCount++;
                continue;
            }
            //走到这里,说明遇到了新的字符,
            //这里先把当前字符和他的数量加入到res中
            res.append(curChar).append(curCharCount);
            //然后让当前字符指向新的字符,并且数量也要
            //重新赋值为1
            curChar = S.charAt(i);
            curCharCount = 1;
        }
        //因为上面计算的时候会遗漏最后一个字符和他的数量,
        //这要添加到res中
        res.append(curChar).append(curCharCount);
    
        //根据题的要求,若“压缩”后的字符串没有变短,
        // 则返回原先的字符串
        return res.length() >= S.length() ? S : res.toString();
    }
    

    还可以换另一种方式,先把当前字符加入到res中,当遇到新的字符的时候再把当前字符的数量加进来,其实原理都差不多,我们来看下

    public String compressString(String S) {
        //边界条件判断
        if (S == null || S.length() == 0)
            return S;
        StringBuilder res = new StringBuilder();
        //先把第一个字符添加到res中
        res.append(S.charAt(0));
        int count = 1;
        for (int i = 1; i < S.length(); i++) {
            //判断重复字符的数量
            if (S.charAt(i) == S.charAt(i - 1)) {
                count++;
                continue;
            }
            //走到这里,说明遇到了新的字符,先把前面字符
            //的数量添加到res中,然后再添加这个新的字符
            res.append(count).append(S.charAt(i));
            count = 1;
        }
        //上面的计算会遗漏最后一个字符的数量,这里加上
        res.append(count);
        return res.length() >= S.length() ? S : res.toString();
    }
    
    cs