|
文章目录
- 题目背景
- 字母异位词分组
- 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)
|
|