字母异位词分组题解Java
其实所谓异位就是指包含的字母是一样的只是位置不同。所以只要把其排序,若是字母异位词应当相等。
class Solution { public List<List<String>> groupAnagrams(String[] strs) { String[] tmp = new String[strs.length]; int index = 0; for(String e : strs){ char[] a = e.toCharArray(); Arrays.sort(a); tmp[index++] = String.valueOf(a); } List<List<String>> ans = new LinkedList<>(); boolean[] vis = new boolean[strs.length]; for(int i = 0 ;i<tmp.length-1;i++){ List<String> t = new LinkedList<>(); if(!vis[i]){ t.add(strs[i]); }else{ continue; } for(int j = i+1;j<tmp.length;j++){ if(tmp[i].equals(tmp[j])){ t.add(strs[j]); vis[j] = true; } } ans.add(t); } if(!vis[strs.length-1]){ List<String> t = new LinkedList<>(); t.add(strs[strs.length-1]); ans.add(t); } return ans; } }
这样子效率是非常慢的用了两层循环。
我们可以换种想法用HashMap。创建映射Key 为排好序的字符串 (Map为一种映射关系 有Key 和value 即值值键对 一个Key 对应一个value Key 不可重复)
class Solution { public List<List<String>> groupAnagrams(String[] strs) { List<List<String>> res = new ArrayList<>(); // 记录 (排序后的字符串,list编号) Map<String, Integer> map = new HashMap<>(); int t = 0; 对应Map长度 for (String str : strs) { String s = sort(str); Integer index = map.get(s); if (index == null) { //如果不存在对应的Key则新建并加入 List<String> list = new ArrayList<>(); list.add(str); res.add(list); map.put(s,t++ ); } else {若存在则对应的列表加入 res.get(index).add(str); } } return res; } public String sort(String s) { char[] c = s.toCharArray(); Arrays.sort(c); return new String(c); } }