标签:leetcode
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; }
标签:leetcode
原文地址:http://blog.csdn.net/fumier/article/details/45191461