您的位置:首页 > 编程语言 > Java开发

[Java]LeetCode49 Anagrams

2015-04-22 10:23 381 查看
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;       
	    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: