LeetCode进阶之路(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.

题目:在一个字符串数组里面分类,有相同字母的放在同一个list。

思路:遍历每一个元素,然后和已存在的相比较,如果字母都相同,就放一起,否则开辟一个新的list。自己的这个解法提交超时,每次遇到新的字符串都要把已存在的都遍历一遍。

public List<List<String>> groupAnagrams(String[] nums) {
		List<List<String>> result = new ArrayList<List<String>>();
		result.add(new ArrayList<String>());
		for(int i = 0; i < nums.length;i++) {
			List<List<String>> current = new ArrayList<List<String>>();
			boolean flag = true;
			for(List<String> l : result) {
				if(l.isEmpty()) {//如果是空的,把第一个放进去。
					l.add(nums[i]);
					ArrayList<String> temp = new ArrayList<>(l);
					current.add(temp);
					flag = false;
				} else {
					if(isSame(nums[i], l.get(0))){//判断是否相同,如果是,就加入已存在的list
						l.add(nums[i]);
						ArrayList<String> temp = new ArrayList<>(l);
						current.add(temp);
						flag = false;
					} 
				}
			}
			if (flag) {//如果不相同,则开辟一个新的list来存放
				ArrayList<String> temp = new ArrayList<>();
				temp.add(nums[i]);
				if (!current.contains(temp)) {
					current.add(temp);
				}
			}
			if(!result.containsAll(current)) {
				result.addAll(current);
			}
		}
		
		return result;
	}
	
	public boolean isSame(String s1, String s2) {//判断两个字符串元素是否一样
		char[] str1 = s1.toCharArray();
		char[] str2 = s2.toCharArray();
		Arrays.sort(str1);
		Arrays.sort(str2);
		
		String st1 = String.valueOf(str1);
		String st2 = String.valueOf(str2);
		if( st1.equals(st2)) {
			return true;
		} else {
			return false;
		}
	}

思路二:这是参考网友的做法,很简洁,用到了map,根据字符做key,key相同的就放一起。

public List<List<String>> groupAnagrams(String[] strs) {
         List<List<String>> result = new ArrayList<List<String>>();
 
    HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
    for(String str: strs){
        char[] arr = new char[26];
        for(int i=0; i<str.length(); i++){
            arr[str.charAt(i)-'a']++;
        }
        String ns = new String(arr);
 
        if(map.containsKey(ns)){
            map.get(ns).add(str);
        }else{
            ArrayList<String> al = new ArrayList<String>();
            al.add(str);
            map.put(ns, al);
        }
    }
 
    result.addAll(map.values());
 
    return result;
    }

种一棵树最好的时间是十年前,其次是现在!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值