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:

  1. For the return value, each inner list's elements must follow the lexicographic order.
  2. All inputs will be in lower-case.
题意:
给定一个单词的数组,然后根据它们的特点分类,如果单词的字母是一致的,那么就分为一组,并且在一组的内部,根据首字母的字母序列来进行排序(如果首字母一样,那么就往下类推。。。)。注意:单词的字母全是小写的,不是大写的。这样便于排序。

题解:
首先利用Char的一些特点来进行做,可以考虑将String转化为Char,因为可以调用String.toCharArray()的方法来转化,然后再调用Arrays.sort()方法来对字母来排序,经过排序后,每个单词中的序列就转化为从小到大的排列。然后就是考虑内部的单词排列,要求从单词从小到大进行排列,那么考虑新生成一个函数用于交换,而且这里有个技巧,就是依次往下走,判断是否需要交换两个单词。
public List<List<String>> groupAnagrams(String[] strs)
	{
		List<List<String>> ans = new ArrayList<List<String>>();
		HashMap<String,Integer> hm = new HashMap<String,Integer>();
		for(int i = 0; i < strs.length; i++)
		{
			boolean added = false;
			char[] tc = strs[i].toCharArray();
			Arrays.sort(tc);
			String tag = new String(tc);
			if(hm.containsKey(tag))             //生成一个HashMap用来判断是否已经含有相关的单词
			{
				List<String> tl = ans.get(hm.get(tag));
				tl.add(strs[i]);
				oneinsert(tl);
				added = true;
			}
			if(added == false)     //判断某一个元素是否被添加到list中
			{
				List<String> tmp = new ArrayList<String>();
				tmp.add(strs[i]);
				ans.add(tmp);
				hm.put(new String(tc), ans.size() - 1);
			}
		}
		return ans;
	}
	public void oneinsert(List<String> tl)     //用来进行List内部的单词排序
	{
		int i = tl.size() - 1;
		String end = tl.get(i);
		String before = tl.get(i - 1);
		if(end.length() == 0)
			return;
		while(stringorder(end,before))
		{
			String tmp = before;
			tl.set(i - 1, end);
			tl.set(i, tmp);
			i--;
			if(i == 0)
				break;
			end = tl.get(i);
			before = tl.get(i - 1);
		}
	}
	public boolean stringorder(String a,String b)      //用来判断是否两个单词需要交换
	{
		int l1 = a.length();
		int l2 = b.length();
		int i = 0;
		int count = 0;
		while(i < l1 && i < l2)
		{
			if(a.charAt(i) - b.charAt(i) > 0)           //从每一个字母进行比较
				return false;
			if(a.charAt(i) - b.charAt(i) < 0)
				return true;
			if(a.charAt(i) - b.charAt(i) == 0)
				count++;
			i++;
		}
		if(l1 < l2 && i == count)
			return true;
		return false;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值