20200314:字母異位詞分組(leetcode49)

題目

在這裏插入圖片描述

思路與算法

  1. 思路很簡單:進行簡單的遍歷,將每次得到的字符串進行排序,再存入map,如果map已經中已經出現了排序後的字符串,說明這倆是異位詞,存入第一次出現的<K,V>組的V數組中。否則,直接在當前K處存入當前V即可完成遍歷,詳細註釋見代碼。

代碼實現

package com.immunize.leetcode.groupAnagrams;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 49.字母異位詞分組
 * 
 * 思路:Hash表遍歷存儲,如果爲異位詞,則放入同一組,輸出即可。
 * 
 * @author Mr IMMUNIZE
 *
 */
public class Solution {
	public List<List<String>> groupAnagrams(String[] strs) {
		// 特殊情況處理
		HashMap<String, List> map = new HashMap<String, List>();

		if (strs.length == 0) {
			return new ArrayList();
		}

		// 遍歷,對字符進行預處理:拆解排序再合併爲String,最後再加入map當前K對應的V處即可。
		for (String val : strs) {

			// 對字符預處理
			char[] tmp = val.toCharArray();
			Arrays.sort(tmp);
			String key = String.valueOf(tmp);

			// 判斷是否存在,不存在則直接加入當前K的映射V處創建list,以待加入
			if (!map.containsKey(key)) {
				map.put(key, new ArrayList());
			}
			// 不管是否存在,都將該字符串加入其對應的K的V處
			map.get(key).add(val);
		}
		List<List<String>> res = new ArrayList(map.values());
		return res;
	}
}

複雜度分析

  1. 由於使用了Arrays的sort,所以內部排序爲歸併排序,複雜度NlogN,外部M,因此總時間複雜度爲O(MNlogN)。
  2. 空間複雜度爲O(MN).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章