leetcode(49)- 字母异位词分组

纯属个人打开学习记录,无任何参考意义

49.字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
说明:
1、所有输入均为小写字母。
2、不考虑答案输出的顺序。

思路

这题目乍一看真简单,写起来真费劲,首先想到的是用map来解决问题,因为要求的返回值是List<List<String>> 类型,获取List里面第几个List这样的操作不太好实现,直接用map的键槽来获取显然方便,还不用遍历。为啥要有获取List里面第几个List这样的操作呢,因为你遍历输入的数组时,每个字符串不一定在List的第一个组合中。
然后就是思考键值槽值放什么数据类型了,槽值好说,肯定是List<String>
这表示一个一个的组合,键值可以是String,或者char数组。
这里的话键值显然要能映射List<String>里面的所有元素,所以我将string类型转换成了char数组,然后调用Array.sort()函数将数组从小到大排序,同样将要检查的strs[i]也进行转换成数组然后从小到大排序,这样也方便比较是否属于同一类。
然后成功的写出了史上跑的最慢的代码,不过还好AC了。。。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
    	List<List<String>> res = new ArrayList<>();
    	Map<char[], List<String>> map = new HashMap<char[], List<String> >();
    	for(int i = 0; i < strs.length; i++)
    	{
    		char[] temp = strs[i].toCharArray();
    		Arrays.sort(temp);
    		String s = String.valueOf(temp);
    		List<String> listTemp = new ArrayList<String>();
    		int flag = 0;
    		for (char[] key : map.keySet()) {
    			   for(int j = 0; j < key.length; j++)
    			   {
    				   if(key[j] != temp[j])
    				   {
    					   break;
    				   }else if(key[j] == temp[j] && j == key.length - 1)
    				   {
    					   map.get(key).add(strs[i]);
    					   flag = 1;
    					   break;
    				   }
    			   }
    			   if(flag == 1)
    			   {
    				   break;
    			   }
    		}
    		if(flag == 0)
    		{
        		listTemp.add(strs[i]);
        		map.put(temp,listTemp);
    		}
    	}
    	for (char[] key : map.keySet())
    	{
    		res.add(map.get(key));
    	}
    	return res;
    }
}

在这里插入图片描述
哈哈哈哈哈我是醉了,尝试了一下然后一点优化的欲望都没有了。。。
然后凑巧的是看了下官方题解,思路一模一样。。。但是他写的如此亭亭玉立。。。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs.length == 0) return new ArrayList();
        Map<String, List> ans = new HashMap<String, List>();
        for (String s : strs) {
            char[] ca = s.toCharArray();
            Arrays.sort(ca);
            String key = String.valueOf(ca);
            if (!ans.containsKey(key)) ans.put(key, new ArrayList());
            ans.get(key).add(s);
        }
        return new ArrayList(ans.values());
    }
}

不要脸的提交了一下。。。
在这里插入图片描述
然后我发现了我傻逼的地方在于把map类的containsKey函数重新写了一遍,而且写的没人家好用,没人家效率高。。。

发布了53 篇原创文章 · 获赞 5 · 访问量 2221

猜你喜欢

转载自blog.csdn.net/qq_37668436/article/details/104683650