|
文章目錄
- 題目背景
- 字母異位詞分組
- C++解法
- Python解法

題目背景
如果大家對于 哈希 類型的概念并不熟悉, 可以先看我之前為此專門寫的算法詳解:
藍橋杯算法競賽系列第九章·巧解哈希題,用這3種數據類型足矣
字母異位詞分組
題目鏈接:字母異位詞分組
解題思路:參考:《la bu la dong》
本題也是異位詞相關,異位詞這類問題的關鍵在于,如何迅速判斷兩個字符串是異位詞,主要考察我們數據編碼和 哈希表的使用:
是否可以找到一種編碼方法,使得字母異位詞的編碼都相同?找到這種編碼方式之后,就可以用一個哈希表存儲編碼相同的所有異位詞,得到最終的答案。
242. 有效的字母異位詞 考察了異位詞的編碼問題,對字符串排序可以是一種編碼方案,如果是異位詞,排序后就變成一樣的了,但是這樣時間復雜度略高,且會修改原始數據。更好的
編碼方案是利用每個字符的出現次數進行編碼
,也就是下面的解法代碼。
代碼詳解:
C++解法
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 建立編碼到分組的映射unordered_map<string, vector<string>> encodeToGroup;// 將相同編碼的字符串放到一個分組中for(auto& str : strs){// 對字符串進行編碼string code = encode(str);// 將相同編碼的字符串放到一起encodeToGroup[code].push_back(str);}// 統計結果vector<vector<string>> res;for(auto& group : encodeToGroup){res.push_back(group.second);}return res;}// 對字符串中字符的出現次數進行編碼string encode(string& s){vector<int> hashNums(26);for(int i = 0; i < s.size(); i++){hashNums[s[i] - 'a']++;}string code(hashNums.begin(), hashNums.end());return code;}
};
Python解法
class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:# 建立編碼后的字符串到分組的映射codeToGroup = {}for s in strs:# 將字符串進行編碼code = self.encode(s)# 將相同編碼的字符串放到同一個分組if code not in codeToGroup:codeToGroup[code] = []codeToGroup[code].append(s)# 獲取結果res = []for group in codeToGroup.values():res.append(group)return res def encode(self, s: str) -> str:# 按照字符出現次數進行編碼count = [0] * 26 # 創建了一個長度為 26 的列表,每個元素都初始化為 0. 這個列表用于記錄每個字母(從 'a' 到 'z')在字符串 中出現的次數.for c in s:delta = ord(c) - ord('a') # 獲取字符的 ASCII值count[delta] += 1return str(count)
|
|