力扣之異位詞(超時優化)
阿新 • • 發佈:2020-12-23
記錄一下今天在刷力扣時遇到的問題,原題描述:
給定一個字串陣列,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字串。
輸入: ["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());
}
}