//   114/117 未能全部通过
package main

import (
	"fmt"
	"strconv"
)

func main() {
	fmt.Println("hello")
	strs := []string{"bdddddddddd", "bbbbbbbbbbc"}
	// strs := []string{"acc", "acc"}
	fmt.Println(groupAnagrams(strs))
}

// 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
// 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

func groupAnagrams(strs []string) [][]string {
	mapDate := make(map[string][]string)
	originMap := make(map[string]int)
	result := [][]string{}
	key := ""
	for i := 0; i < 26; i++ {
		originMap[string(rune(97+i))] = 0
	}
	for i := 0; i < len(strs); i++ {
		key = ""
		strElement := strs[i]
		for j := 0; j < len(strElement); j++ {
			fmt.Print(string(strElement[j]))
			originMap[string(strElement[j])] = originMap[string(strElement[j])] + 1
		}
		fmt.Println()
		for i := 0; i < 26; i++ {
			key = key + strconv.Itoa(originMap[string(rune(97+i))])
			originMap[string(rune(97+i))] = 0
		}
		if rowList, isOK := mapDate[key]; isOK {
			rowList = append(rowList, strElement)
			mapDate[key] = rowList
		} else {
			rowList = append(rowList, strElement)
			mapDate[key] = rowList
		}
	}
	for _, v := range mapDate {
		result = append(result, v)
	}
	fmt.Println(mapDate)
	return result
}

/*
func groupAnagrams(strs []string) [][]string {
	// var mapCompare func(map1 map[byte]int, map2 map[byte]int) bool
	mapCompare := func(map1 map[byte]int, map2 map[byte]int) bool {
		// fmt.Println(map1, map2)
		for k, v := range map1 {
			if map2[k] != v {
				return false
			}
		}
		for k, v := range map2 {
			if map1[k] != v {
				return false
			}
		}
		return true
	}
	result := [][]string{}
	mainMap := make(map[int]map[byte]int)
	// subMap := map[string]bool{"a": true}
	// mainMap[0] = map[byte]bool{0: false}
	count := 0
	for i := 0; i < len(strs); i++ {
		// fmt.Println("----------------------------------------", i)
		strElement := strs[i]
		subMap := make(map[byte]int)
		for j := 0; j < len(strElement); j++ {
			value, isOk := subMap[strElement[j]]
			if isOk {
				subMap[strElement[j]] = value + 1
			} else {
				subMap[strElement[j]] = 1
			}
		}
		flag := true
		for flag {
			for k, _ := range mainMap {
				if mapCompare(subMap, mainMap[k]) {
					row := result[k]
					row = append(row, strElement)
					result[k] = row
					flag = false
					break
				}
			}
			if flag {
				row := []string{}
				row = append(row, strElement)
				result = append(result, row)
				flag = false
				mainMap[count] = subMap
				count++
				flag = false
			}
		}
		// fmt.Println(subMap)
		// fmt.Println(mainMap)
		// fmt.Println(result)
	}
	// for i := 0; i < count; i++ {
	// 	listElement := []string{}
	// 	if
	// }
	return result
}
*/
