LeetCode热题100精讲——Top2:字母异位词分组【哈希】
|
文章目录
- 题目背景
- 字母异位词分组
- 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] += 1
return str(count)
|
|