给出一个字符串,以 字符在串中出现的次数 为第一关键字,字典序为第二关键字排序字符串。
样例
样例1
输入: str = "bloomberg"
输出: "bbooeglmr"
解释:
'b'和'o'出现次数最多,但是'b'字典序较小,排名第一,其次是'o',以此类推.
样例2
输入: str = "lintcode"
输出: "cdeilnot"
解释:
所有字符出现次数一样多,所以直接按照字典序排序。
注意事项
- 字符串长度小于
10000
- 所有字符均为小写
解题思路:
建立Pair 类用来存储字符以及字符出现的次数,方便后续写Compare函数
注意这里是以字符出现次数为降序,字符顺序为升序排序。方便记忆:若Compare(a, b)降序即b-a,升序即a-b
public class Solution {
class Pair{
public char c;
public int cnt;
public Pair(char c, int cnt){
this.c = c;
this.cnt = cnt;
}
}
/**
* @param str: the string that needs to be sorted
* @return: sorted string
*/
public String stringSort(String str) {
// Write your code here
if (str == null || str.length() == 0)
return str;
//初始化pairs数组,存储对应字符及次数
Pair[] pairs = new Pair[26];
for (int i = 0; i < 26; i++)
pairs[i] = new Pair((char)('a' + i), 0);
for (char c : str.toCharArray())
pairs[c - 'a'].cnt++;
Arrays.sort(pairs, new Comparator<Pair>(){
@Override
public int compare(Pair a, Pair b){
if(a.cnt != b.cnt)
return b.cnt - a.cnt;//以次数为降序
else
return a.c - b.c;//以字符顺序为升序
}
});
StringBuilder sb = new StringBuilder();
for(int i=0; i<pairs.length; i++)
for(int j=0; j<pairs[i].cnt; j++)
sb.append(pairs[i].c);
return sb.toString();
}
}