import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param strs string字符串一维数组
     * @return string字符串一维数组
     */
    public static String[] groupAnagrams (String[] strs) {
        // write code here
        Arrays.sort(strs);
        LinkedList<LinkedList<String>> linkedLists = new LinkedList<>();
        for (int i = 0; i < strs.length; i++) {
            boolean flag = false;
            for (int j = 0; j < linkedLists.size(); j++) {
                if (isSameConstruct(strs[i],
                                    linkedLists.get(j).get(linkedLists.get(j).size() - 1))) {
                    linkedLists.get(j).add(strs[i]);
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                LinkedList<String> linkedList = new LinkedList<>();
                linkedList.add(strs[i]);
                linkedLists.add(linkedList);
            }
        }
        String[] strings = new String[linkedLists.size()];
        for (int i = 0; i < linkedLists.size(); i++) {
            strings[i] = concat(linkedLists.get(i));
        }
        return strings;
    }

    public static String concat(LinkedList<String> linkedList) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < linkedList.size(); i++) {
            stringBuffer.append(linkedList.get(i) + ",");
        }
        return stringBuffer.substring(0, stringBuffer.length() - 1);
    }


    public static boolean isSameConstruct(String string1, String string2) {
        if (string1.length() != string2.length()) {
            return false;
        }
        Map<Character, Integer> map1 = new HashMap<>();
        Map<Character, Integer> map2 = new HashMap<>();
        for (int i = 0; i < string1.length(); i++) {
            map1.put(string1.charAt(i), map1.getOrDefault(string1.charAt(i), 0) + 1);
        }
        for (int j = 0; j < string2.length(); j++) {
            map2.put(string2.charAt(j), map2.getOrDefault(string2.charAt(j), 0) + 1);
        }
        for (Map.Entry<Character, Integer> myMap : map1.entrySet()) {
            if (!myMap.getValue().equals(map2.get(myMap.getKey()))) {
                return false;
            }
        }
        return true;
    }

}

本题主要考察的知识点是字符串,所用编程语言是java.

我额外定义了两个函数,一个函数用于判断两个字符串是否由相同的字符组成,一个函数用于将LinkedList里面存储的字符串转化为一个字符串,剩下的就是遍历整个字符串数组就行了。