import java.util.*;

/**
 * NC294 字母异位词分组
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param strs string字符串一维数组
     * @return string字符串二维数组
     */
    public String[][] groupAnagrams (String[] strs) {
        // return solution1(strs);
        return solution2(strs);
    }

    /**
     * 排序+哈希
     * @param strs
     * @return
     */
    private String[][] solution1(String[] strs){
        HashMap<String, ArrayList<String>> map = new HashMap<>();

        String key;
        char[] chars;
        ArrayList<String> list;
        for(String str: strs){
            chars = str.toCharArray();
            Arrays.sort(chars);
            key = String.valueOf(chars);
            if(map.containsKey(key)){
                list = map.get(key);
            }else{
                list = new ArrayList<>();
            }
            list.add(str);
            map.put(key, list);
        }

        String[][] result = new String[map.size()][];
        int i = 0;
        for(String keyWord: map.keySet()){
            list = map.get(keyWord);
            result[i] = new String[list.size()];
            for(int j=0; j<list.size(); j++){
                result[i][j] = list.get(j);
            }
            i++;
        }

        return result;
    }

    /**
     * 排序+哈希: 简化
     * @param strs
     * @return
     */
    private String[][] solution2(String[] strs){
        HashMap<String, ArrayList<String>> map = new HashMap<>();

        String key;
        char[] chars;
        ArrayList<String> list;
        for(String str: strs){
            chars = str.toCharArray();
            Arrays.sort(chars);
            key = String.valueOf(chars);
            if(map.containsKey(key)){
                list = map.get(key);
            }else{
                list = new ArrayList<>();
            }
            list.add(str);
            map.put(key, list);
        }

        String[][] result = new String[map.size()][];
        int i = 0;
        for(String keyWord: map.keySet()){
            list = map.get(keyWord);
            result[i] = new String[list.size()];
            list.toArray(result[i]);
            i++;
        }

        return result;
    }
}