Group Anagrams

Group Anagrams

Given an array of strings, group anagrams together.   

Example:   
Input: ["eat", "tea", "tan", "ate", "nat", "bat"],
Output:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

思路

这个题想要我们求解的其实是能否判断一个字符串是否由某些字符排列组成。   
我的思路就是把一个字符串中的每个字符的ASCII码映射到一个整数的索引 ,
把索引处的bit设置为1,然后我们判断根据字符串得到的这个整数是否相等,相等即说明两个字符串是满足上述的。

代码

func SetBitToOne(args ...uint32) uint32 {
	var ret uint32

	for _, num := range args {
		ret = ret | (1 << num)
	}

	return ret
}

func groupAnagrams(strs []string) [][]string {

	ret := make([][]string, len(strs))
	comp := make(map[uint32]uint32)
	var index uint32 = 0

	for _, str := range strs {
		var pos []uint32
		for i, _ := range str {
			pos = append(pos, uint32(int(str[i])-int('a')))
		}

		val := SetBitToOne(pos...)
		fmt.Println(str, "val", val)
		ind, ok := comp[val]
		if !ok {
			comp[val] = index
			ret[index] = append(ret[index], str)
			index++
		} else {
			ret[ind] = append(ret[ind], str)
		}
	}

	return ret[:index]
}

关于作者

大四学生一枚,分析数据结构,面试题,golang,C语言等知识。QQ交流群:521625004。微信公众号:后台技术栈。
image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值