Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
题意,就是判断字符数组中是否有回文字符串(判断两个字符串是否由相同的字母组成,但是顺序有可能不一样)。
解题思路:首先想到的是将数组中的字符按字母顺序重排列。然后用map存储,字符串做为key值,用一个List链表记录排序之前的字符串在数组中的index。然后判读list中长度,大于1的说明是有回文字符,加入list。
public List<String> anagrams(String[] strs) {
List<String> list=new ArrayList<String>();
int len=strs.length;
if(len<=1)return list;
Map<String,List<Integer>> map=new HashMap<String,List<Integer>>();
String str=null;
StringBuffer buffer=new StringBuffer();
for(int i=0;i<len;i++)
{
str=strs[i];
char[] chars=str.toCharArray();
Arrays.sort(chars);
for(char ch:chars)
{
buffer.append(ch);
}
str=buffer.toString();
buffer.delete(0,str.length());
if(map.get(str)==null)
{
List<Integer> tmpList=new ArrayList<Integer>();
tmpList.add(i);
map.put(str, tmpList);
}
else
{
map.get(str).add(i);
}
}
Set<String> keySet=map.keySet();
for(Iterator<String> iter=keySet.iterator();iter.hasNext();)
{
String keyStr=iter.next();
List<Integer> listIndex=map.get(keyStr);
len=listIndex.size();
if(len<=1)continue;
for(int i=0;i<len;i++)
{
list.add(strs[listIndex.get(i)]);
}
}
return list;
}
运行的时间比较长,766ms。是否能优化一下呢。在判断的时候直接存储。
public List<String> anagrams(String[] strs) {
List<String> list=new ArrayList<String>();
int len=strs.length;
if(len<=1)return list;
Map<String,Integer> map=new HashMap<String,Integer>();
String str=null;
for(int i=0;i<len;i++)
{
str=strs[i];
char[] chars=str.toCharArray();
Arrays.sort(chars);
str=new String(chars);
if(map.containsKey(str))//判断map中是否有重排列的str
{
int index=map.get(str);
if(index!=-1)//判断是否是第二次存在相同的key。如果是,将第一次的index所对应的数组值取出加入list
{
list.add(strs[index]);
map.put(str,-1);
}
list.add(strs[i]);
}else
{
map.put(str,i);
}
}
return list;
}