LeetCode.49 Group Anagrams

题目:

Given an array of strings, group anagrams together.

For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
Return:

[
  ["ate", "eat","tea"],
  ["nat","tan"],
  ["bat"]
]

Note: All inputs will be in lower-case.

分析1(推荐-参考算法):

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //anagrams:颠倒字母而成的字
        //给定字符串数组,匹配其中相同组成的子串,其中输入均为小写
        //思路:使用HashMap实现
        if(strs.length==0||strs==null){
            return new ArrayList<List<String>>();
        }
        
        Map<String,List<String>> map=new HashMap<String,List<String>>();
        for(String str:strs){
            char [] ch=str.toCharArray();
            Arrays.sort(ch);
            String keyStr=String.valueOf(ch);
            if(!map.containsKey(keyStr)){
                map.put(keyStr,new ArrayList<String>());
            }
            map.get(keyStr).add(str);
        }
        return new ArrayList<List<String>>(map.values());
        
    }
}



分析2(数组长度太长时间超时-原创算法):

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //anagrams:颠倒字母而成的字
        //给定字符串数组,匹配其中相同组成的子串,其中输入均为小写
        //设定一个数组标识是否已经被访问过
        //该方法适用于数组长度不是特别长的
        List<List<String>> list=new ArrayList<>();
        if(strs==null||strs.length==0)return list;
        
        boolean [] flag=new boolean[strs.length];
        
        
        for(int i=0;i<strs.length;i++){
            List<String > subList=new ArrayList<>();
            if(!flag[i]){
                //未被访问过
                subList.add(strs[i]);
            
                for(int j=i+1;j<strs.length;j++){
                    if(!flag[j]&&equalStrings(strs[j],strs[i])){
                        subList.add(strs[j]);
                        //标志位置为true
                        flag[j]=true;
                    }
                }
            }
            if(subList.size()!=0){
                //防止添加空List子集
                list.add(subList);
            }
            
        }
        return list;
        
        
    }
    //比较两个字符串是否相等
    public boolean equalStrings(String str1,String str2){
        if(str1.length()!=str2.length()){
            return false;
        }
        //排序
        char [] ch1=str1.toCharArray();
        char [] ch2=str2.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        
        String newStr1=String.valueOf(ch1);
        String newStr2=String.valueOf(ch2);
        
        return newStr1.equals(newStr2);
        
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值