Anagrams
思路:
方法一:
建一个hashtable, HashMap<String, List<String>>。逐个扫描strs,然后sort, 思路显而易见。
时间复杂度是O(nklogk)。k: length of longest string in strs.
方法二:
把string 转化成int[26], 记录每一个字符的个数:count[c - 'a']。然后再把count[26]转化成统一格式的string: "#0#0#0#0....." #eachcount,一个26个。目的和sort一样的,如果是anagram转化完成后会相等,只不过时间复杂度变成了O(nk)。
代码如下:
. 获取所有的value: public Collection<V> values()
方法一:
建一个hashtable, HashMap<String, List<String>>。逐个扫描strs,然后sort, 思路显而易见。
时间复杂度是O(nklogk)。k: length of longest string in strs.
方法二:
把string 转化成int[26], 记录每一个字符的个数:count[c - 'a']。然后再把count[26]转化成统一格式的string: "#0#0#0#0....." #eachcount,一个26个。目的和sort一样的,如果是anagram转化完成后会相等,只不过时间复杂度变成了O(nk)。
代码如下:
public class Solution {
/*
* @param strs: A list of strings
* @return: A list of strings
*/
public List<String> anagrams(String[] strs) {
// write your code here
List<String> res = new ArrayList<>();
if(strs.length == 0|| strs == null) {
return res;
}
Map<String, ArrayList<String>> map = new HashMap<>();
int[] count = new int[26];
for(String s: strs) {
Arrays.fill(count, 0);
for(char c: s.toCharArray()) {
count[c - 'a']++;
}
StringBuilder sb = new StringBuilder("");
for(int i = 0; i < 26; i++) {
sb.append("#" + count[i]);
}
String key = sb.toString();
if(!map.containsKey(key)) {
map.put(key, new ArrayList<String>());
}
map.get(key).add(s);
}
for(String key: map.keySet()) {
if(map.get(key).size() > 1) {
res.addAll(map.get(key));
}
}
return res;
}
}
要注意hashmap的一些基本操作,例如获取所有的key:public Set<K> keySet(). 获取所有的value: public Collection<V> values()
评论
发表评论