题目:
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:
- For the return value, each inner list's elements must follow the lexicographic order.
- 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;
}