[Java]LeetCode49 Anagrams

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.