题目地址:
https://www.lintcode.com/problem/sort-anagrams-array/description
给定一个字符串数组,要求按照其字典序最小的anagram的字典序进行排序,并且是稳定排序。
我们可以将每个字符串进行排序,得到其字典序最小的anagram,然后开一个TreeMap,key是这个anagram,value是其对应的那些字符串组成的ArrayList,这样就保证了原先的顺序。将原数组遍历完成后,再从Map里把每个字符串按顺序取出来即可。代码如下:
import java.util.*;
public class Solution {
/**
* @param str: a string array
* @return: return a sorted string array
*/
public String[] SortAnagramsArray(String[] str) {
// write your code here
// map按照每个字符串对应的anagram作为key来排序
Map<String, List<String>> map = new TreeMap<>();
for (String s : str) {
String sorted = sortStr(s);
map.putIfAbsent(sorted, new ArrayList<>());
map.get(sorted).add(s);
}
int idx = 0;
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
for (String s : entry.getValue()) {
str[idx++] = s;
}
}
return str;
}
// 将s的字符进行排序,得到字典序最小的anagram
private String sortStr(String s) {
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
sb.append((char) ('a' + i));
}
}
return sb.toString();
}
}
时间复杂度 O ( n ( l + log n ) ) O(n(l+\log n)) O(n(l+logn)),空间 O ( n l ) O(nl) O(nl), n n n为字符串个数, l l l为字符串最长长度。