1.题目
给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。
对于字符串数组 ["lint","intl","inlt","code"]
返回 ["lint","inlt","intl"]
2.算法
在这道题中我们维护一个HashMap,其中的key是每个字符串排序后又重新形成的字符串,value为字符数组中排序之后为key的字符串集合,当集合的长度大于2时返回集合
public ArrayList<String> anagrams(String[] strs)
{
ArrayList<String> res = new ArrayList<String>();
if (strs == null && strs.length == 0)
{
return res;
}
HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();
for (int i = 0; i < strs.length; i++)
{
char[] charArr = strs[i].toCharArray();
Arrays.sort(charArr);
String str = new String(charArr);
if (hm.containsKey(str))
{
hm.get(str).add(strs[i]);
}
else
{
ArrayList<String> list = new ArrayList<String>();
list.add(strs[i]);
hm.put(str, list);
}
}
Iterator iter = hm.values().iterator();
while(iter.hasNext())
{
ArrayList<String> item = (ArrayList<String>)iter.next();
if (item.size() > 1)
{
res.addAll(item);
}
}
return res;
}
源链接