原题地址: leetcode-cn.com/problems/co…
思路: 贪心, 构造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;
}
}