49. Group Anagrams

29 篇文章 0 订阅
13 篇文章 0 订阅

属于hashTable

题目描述:

Given an array of strings, group anagrams together.

Example:

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

Note:

  • All inputs will be in lowercase.
  • The order of your output does not matter.

思路:

用一个hashmap存储:key是字符串(元素)的字典排序,value存储的是该类似的字符串在lists中的存储位置

新来一个字符串:先查看这个字符串的字典排序是否已经在hashmap中了,如果有,说明lists中也已经存在类似的了,直接在相应list添上就好了;如果没有:说明这是第一个,就把它的字典排序存放到hashmap中,并记录这是第几个存放到lists中的,并且在lists中新添加一个list来存放

 

有一个易错点,就是“接在相应list添上就好了”,这里直接:

lists.get(weizhi).add(strs[i]);

而不能:注意这里直接在里面操作,不要再拿出来,再放进去,会出错的!!!!!!!!!

List<String> list = lists.get(weizhi);
list.add(strs[i]);
lists.add(weizhi , list);

冒泡排序:

 

字符数组与字符串的相互转换:

 https://www.cnblogs.com/chengzilomo/p/5063881.html

方法一:直接用数组转字符串方法效果如下

 char[] c1 = new char[]{'a','d','s'};
 return = Arrays.toString(c1);

输出效果:[a, d, s]

 

方法三:推荐使用

 char[] c4 = new char[]{'a','d','s','a','d','s'};
 return new String(c4);

输出效果:adsads

本题代码:

//求字符串的字典排序
    public static String zidian(String str){
        //冒泡:从小到大
        int n = str.length();
        char[] chars = str.toCharArray();
        for(int i = 0;i<n-1;i++){
            for(int j = 0;j<n-i-1;j++){
                if(chars[j]>chars[j+1]){
                    //交换
                    char ch = chars[j];
                    chars[j] = chars[j+1];
                    chars[j+1] = ch;
                }
            }
        }
        return Arrays.toString(chars);
    }

    public static List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> lists = new ArrayList<List<String>>();
        Map<String,Integer> map = new HashMap<String, Integer>();
        int lists_count = 0;

        for(int i = 0 ;i<strs.length;i++){
            //如果存在的话,就加入到list的相应位置
            if(map.containsKey(zidian(strs[i]))){
                int weizhi = map.get(  zidian(strs[i])  );
                lists.get(weizhi).add(strs[i]);
                //List<String> list = lists.get(weizhi);
                //list.add(strs[i]);
                //lists.add(weizhi , list);
                //注意这里直接在里面操作,不要再拿出来,再放进去,会出错的!!!!!!!!!
            }else {
                //如果不存在的话,就加入到lists中
                List<String> list = new ArrayList<String>();
                list.add(strs[i]);
                lists.add(list);
                lists_count++;
                //并且把strs[i]的元素 和 在lists中的位置 存入到hashmap中
                map.put(zidian(strs[i]),lists_count-1);

            }
        }
        return lists;
    }

    public static void main(String[] args) {
        String [] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
        List<List<String>> lists = groupAnagrams(strs);
        for(int i = 0 ;i<lists.size();i++){
            for(int j =0 ;j<lists.get(i).size();j++){
                System.out.print(lists.get(i).get(j)+"  ");
            }
            System.out.println("");
        }
    }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值