1. 程式人生 > 其它 >力扣之異位詞(超時優化)

力扣之異位詞(超時優化)

技術標籤:演算法學習演算法leetcodejava

記錄一下今天在刷力扣時遇到的問題,原題描述:

給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。

輸入: ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

說明:

  • 所有輸入均為小寫字母。
  • 不考慮答案輸出的順序。

我的思路是:
1、首先對入參strs進行兩兩檢查(即check函式),如果是一個異位詞,就將其加入到一個List中,有多少個異位詞,該List就做多少次add操作。但雙重迴圈遍歷後,我發現一個詞被計算了多次,就像[eat,tae,eta]為一個List,[tae,eta]為另一個List,發現問題後,我使用sign這樣一個布林型的標記陣列對傳入的strs中的每一個串進行標記,如果在第一次遍歷中他就已經被識別為異位詞,那麼他就不需要在考慮。

2、然後就是實現的check函式,我需要對傳入的兩個串進行檢查,如果是異位詞返回真,否則返回假。具體的邏輯我解除安裝了程式碼註釋中。

我是用Java程式碼提交的,程式碼如下:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        //標記位 如果某個串已經被加入到了異位詞中 將不在對其進行處理
        boolean[] sign = new boolean[strs.length];
        List<List<String>> con = new ArrayList<>();
        List<String> cur =
null; for (int i = 0; i < strs.length; i++) { //檢查是否已經將其加入到了異位List中 if (!sign[i]) { cur = new ArrayList<>(); cur.add(strs[i]); //第一次遍歷必定是需要加入的 for (int j = i + 1; j < strs.length; j++) { if (Solution.check(strs[i], strs[j])) { sign[j] = true; cur.add(strs[j]); } } con.add(cur); } } return con; } /*判斷兩個字串是否是異位詞 * * 執行邏輯是:遍歷source串中每一個字元 在target串中搜尋 *是否存在該字元,如果不存在直接返回false,如果存在就刪除掉, *在遍歷source串結束後,去檢查target的長度,如果相等就可以 *返回true(說明source中的每個字元都找到了 且和source是異位關係) */ private static boolean check(String source, String target) { for (int i = 0; i < source.length(); i++) { String s = source.charAt(i) + ""; if (target.contains(s)) { target = target.replaceFirst(s, ""); } else { return false; } } if (target.length() == 0) { return true; } return false; } }

提交之後發現112個案例我過了111個,最後一個串逆天的長,一直超時,始終過不了。

開啟後看到最後一個案例後,我的心巴涼巴涼的~
在這裡插入圖片描述


優化一段時間後,也不見效果,得,看看被人思路唄。

1、首先我們在遍歷strs時對其中的每一個串進行排序,目的是檢查有沒有異位詞,如果存在一個異位詞,就將其加入到一個容器中。

沒了~

就這麼簡單(我可真菜呢,Map這麼實用的工具,硬是拋後腦勺去了,還忙半天寫了n行程式碼,哈哈哈~)。

AC程式碼如下:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
       Map<String, ArrayList<String>> container = new HashMap<>();
        for (String s : strs) {
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            //檢查容器中是否存在這樣一個異位詞
            String cur = String.valueOf(chars);
            if (!container.containsKey(cur)) {
                container.put(cur, new ArrayList<>());
            }
            //是第一個詞或者是一個異位詞 加入到value中
            container.get(cur).add(s);
        }
        return new ArrayList<>(container.values());
    }

}

原題連結:https://leetcode-cn.com/problems/group-anagrams