天天看點

Java字元串壓縮(兩種壓縮方式)

第一種,隻統計字元出現次數,比如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();
    }      

第二種,統計相鄰字元串出現次數,比如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();
    }      

測試:

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"));
    }      

結果:

唱跳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