本章记录一些有关哈希表的一些较为经典或者自己第一次做印象比较深刻的算法以及题型,包含自己作为初学者第一次碰到题目时想到的思路以及网上其他更优秀的思路,本章持续更新中......
目录
No 49. 字母异位词分组(中等)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams/
题目描述:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
思路:这个题目是哈希表的典型题目。所谓字母异位词就是相同数量和类型的字母组合成的不同单词。所以我们可以将每一个字符串进行一个排序作为 map 的 key 值,这样会导致所有的字母异位词有相同的key,把这一类字符串放在一个字符串数组中即可。结合题干,结果列表是无序的,那么采用unordered_map是一个高效的选择。创建的map的key的类型为string,value的类型为vector<string>。具体如下:
首先用一个增强型for循环遍历字符串数组,将每一个字符串排序;其次将这个排序的字符串作为 map 的 key 值,并将该字符串未排序的状态写入到value中。最后将map的value写入到结果字符串数组中即可。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> result;
//map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的
unordered_map<string, vector<string>> map;
for (string str : strs) {
//拿到每一个字符串
string key = str;
//sort函数:第一个参数first:是要排序的数组的起始地址。
//第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)
//第三个参数comp是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序。
sort(key.begin(), key.end());
//把这个key和这个str建立映射关系
map[key].push_back(str);
}
//auto是根据后面的数据自动确定数据类型
for (auto it = map.begin(); it != map.end(); it++) {
//it->first 表示的是这个元素的key的值;
//it->second 表示的是这个元素的value的值。
result.push_back(it->second);
}
return result;
}
};
No 438.找到字符串中所有字母异位词(中等)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
题目描述:
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
思路:这个题目我最初想到的是子串匹配,在匹配的过程中利用数组记录。具体如下:首先将字符串 p 用一个数组进行遍历,数组的下标为 字母在0-25上的映射,数值为出现的次数。其次开始遍历字符串 s ,用同样的方式记录字符串 s 的字母,只不过是以字符串 p 的长度为一轮遍历的长度的,即每次都从一个字符开始,往后走 p.length()个位置;然后比对此时两个记录数组的值是否相同。若相同,则找到了一个异位词子串,记录起始位置,并开始下一轮。否则直接开