劍指leetcode—字母異位詞分組

題目描述:給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。

示例:
輸入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
輸出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
說明:
所有輸入均爲小寫字母。
不考慮答案輸出的順序。

分組問題,所以需要設定分組的依據
方法一:
排序數組分類,維護一個映射哈希表 ans :{String ->List},每個鍵K都是一個排序了的字符串,每個值都是初始輸入的字符串列表。
java中我們將鍵存儲爲字符串,舉一個例子
在這裏插入圖片描述

java代碼實現:

class Solution{
	public List<List< String>> groupAnagrams(String [] strs){
		if(strs.length==0) return new ArrayList();
		Map<String,List> ans=new HashMap<String,List>();
		for(String s:strs){
			char a[] =s.toCharArray();
			Arrays.sort(a);
			String key=String.valueOf(a);
			if(!ans.containsKey(key))
			ans.put(key,new ArrayList());
			ans.get(key).add(s);
		}
	return new ArrayList(ans.values());
	}
}

方法二:
按計數分類
思路
當且僅當它們的字符計數(每個字符的出現次數)相同時,兩個字符串是字母異位詞。
算法
我們可以將每個字符串 s 轉換爲字符數 count,由26個非負整數組成,表示 a,b,c的數量等。我們使用這些計數作爲哈希映射的基礎。

在 Java 中,我們的字符數 count 的散列化表示將是一個用 字符分隔的字符串。 例如,abbccc 將表示爲 #1#2#3#0#0#0 …#0,其中總共有26個條目
在這裏插入圖片描述
java代碼實現:

class Solution {
    public List<List< String>> groupAnagrams(String[] strs) {
       if(strs.length==0)
       return new ArrayList();
       Map<String ,List> ans=new HashMap<String,List>();
       int [] count=new int [26];
       for(String s:strs){
       	Arrays.fill(count,0);
       	for(char c:s.toCharArray())
       	count[c-'a']++;
       	StringBuilder res=new StringBuilder("");
       	for(int i=0;i<26;i++){
       		res.append('#');
       		res.append(count[i]);
       		}
       		String key=res.toString();
       		if(!ans.containsKey(key))
       		ans.put(key,new ArrayList());
       		ans.get(key).add(s);
       		}
       		return new ArrayList(ans.values());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章