给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:所有输入均为小写字母。
不考虑答案输出的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public List<List<String>> groupAnagrams(String[] strs) { //思路: List<List<String>> result = new ArrayList<>(); for(int i = 0; i < strs.length ; i++){ //如果非空,判断是否有字母异位的单词 boolean isAdd = false; for(int j = 0 ; j < result.size() ; j++){ boolean ec = isEctopic(strs[i],result.get(j).get(0)); if(ec){ isAdd = true; result.get(j).add(strs[i]); break; } } if(!isAdd){ List<String> centerValue = new ArrayList<>(); centerValue.add(strs[i]); result.add(centerValue); } } return result; } //判断字母是否为字母异位 public boolean isEctopic(String a, String b){ if(a.length() != b.length()){ return false; } int [] numbers = new int[26]; for(int i = 0 ; i < a.length() ; i++){ numbers[a.charAt(i) - 'a']++; } int index = 0; for(int i = 0 ; i < b.length() ; i++){ index = b.charAt(i) - 'a'; if(numbers[index] == 0){ return false; } numbers[index]--; } return true; }
public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> map = new HashMap<String, List<String>>(); for (String str : strs) { char[] array = str.toCharArray(); Arrays.sort(array); String key = new String(array); List<String> list = map.getOrDefault(key, new ArrayList<String>()); list.add(str); map.put(key, list); } return new ArrayList<List<String>>(map.values()); }
时间复杂度:O(nklogk),其中 nn 是strs 中的字符串的数量,kk 是 strs 中的字符串的的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及O(1) 的时间更新哈希表,因此总时间复杂度是 O(nklogk)。
空间复杂度:O(nk),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要用哈希表存储全部字符串。