1st group anagram 49

典型的用HashMap来存单次。。。单词的解析码是所有字母排序相同的值。


import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Arrays;
// import container 时,要import 接口和对应的子类。。。Arrays是个常用的类哦。。
public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
    // 这题的意思是找到字母出现次数一样的词,但是字母位置不一样,放在一个集合里。
    // 既然是集合,那就是用List来存储咯,container用处确实广泛
    // 但是核心的部分是 用什么数据结构+对应算法 来判断anagrams。
    // 简单的思路是:如果不是anagram,则新建一个element集合;如果是,就在该element集合内添加新成员;
    // 为每一个str建立 pair<set<Character>, String>; 新建一个Map<set<Character>, String[]>; 最后遍历map,把String[]改装成题目需要的形式。。。
    
    // 看了四火的解答,跟我的思路是一样的,其实就是ECS124课上最后一个HW,看来ECS124TA还是没白当
    // 四火的解答,聪明之处在于,找到所有anagrams对应的一个公共key,就是字母顺序排列好的String,等同与ECS124HW4里的kmer
    // 比我的Set<Character> 在思路和实现方法上都简单一些。
    
    if(strs.length==0) return null;
    Map<String, List<String>> map= new HashMap<String, List<String>>();
    
    for(String s: strs){
        // create a search key, s_key, for every string, anagrams should have the same s_key;
        char[] s_charArray= s.toCharArray();
        Arrays.sort(s_charArray);
        String s_key= new String(s_charArray);
        
        if(!map.containsKey(s_key)) map.put(s_key, new ArrayList<String>());  // here is new ArrayList<String>, not new List<String> !!你忘了最后的(), 这是constructor!!! 无参constructor很容易忘了()
        map.get(s_key).add(s);
    }
    List<List<String>> result = new ArrayList<List<String>>();  // !!! new 后面不能加接口,要加子类!!!
    
/*    for(Map.Entry<String, List<String>> listStr: map.entrySet()){
        result.add(listStr.getValue());
    }*/ // the following is an easy to understand way.
    
    for(String str: map.keySet()){
        result.add(map.get(str));
    }
    
    return result;
    
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值