LeetCode281周赛: 6014. 构造限制重复的字符串

152 阅读1分钟

原题地址: leetcode-cn.com/problems/co…

image.png

思路: 贪心, 构造map存储遍历次数, 每次取最大的字母, 遍历不超过repeatLimit次, 若有剩余则再取一次除当前字母外最大字母, 依次追加

class Solution {
    public String repeatLimitedString(String s, int repeatLimit) {
        int[] map = new int[26];
        // 构造map
        for (int i = 0; i < s.length(); i++) {
            map[s.charAt(i) - 'a'] ++;
        }
        // 结果字符串
        StringBuilder stringBuilder = new StringBuilder();
        // 找最大的字母
        int minChar = getMinChar(map, map.length - 1);
        // 直到minChar获取不到值
        while (minChar >= 0) {
            int count = Math.min(repeatLimit, map[minChar]);
            while (count -- > 0) {
                map[minChar] --;
                stringBuilder.append((char) (minChar + 'a'));
            }
            if (minChar == 0) break;
            // 剩下的
            if (map[minChar] != 0) {
                int temp = minChar;
                minChar = getMinChar(map, minChar - 1);
                if (minChar < 0) break;
                stringBuilder.append((char) (minChar + 'a'));
                map[minChar] --;
                minChar = getMinChar(map, temp);
            } else {
                minChar = getMinChar(map, minChar);
            }
        }
        return stringBuilder.toString();
    }

    public int getMinChar(int[] map, int minChar) {
        for (int i = minChar; i >= 0; i--) {
            if (map[i] != 0) return i;
        }
        return -1;
    }
}