標籤: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; }
[Java]LeetCode49 Anagrams