集合与字典 :
- 集合常见的形式是Set,字典常见的形式是Map
- Set 和 Map 主要的应用场景在于 数据重组 和 数据储存。
集合 与 字典 的区别:
- 共同点:集合、字典 可以储存不重复的值
- 不同点:集合类似于数组,元素的只有key没有value,value就是key。字典是以 [key, value] 的形式储存,键的范围不限于字符串,各种类型的值(包括对象)都可以当作键
时间复杂度:
set或map可以用哈希表或平衡二叉搜索树实现
哈希表实现的map或者set查找的时间复杂度是O(1)
,哈希表优点是查找非常快,哈希表的缺点是失去了数据的顺序性,平衡二叉搜索树实现的map或set查找时间复杂度是O(logn)
,它保证了数据顺序性
哈希函数
哈希函数是一个接受输入值的函数,由此输入计算出一个确定输出。
- 均匀分布:哈希函数计算出来的地址均匀分布
- 哈希碰撞:哈希函数计算出来的结果冲突
- 开放定址法
- 链地址法
242. 有效的字母异位词 (easy)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:输入: s = “rat”, t = “car”
输出: false提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
方法1.排序
- 思路:两个字符串转成数组,排序后转回字符串进行比较。
- 复杂度分析:时间复杂度
O(nlogn)
,排序采用快排,时间复杂度是nlogn,比较两字符串是否相等时间复杂度为n,O(n)+O(nlogn)=O(nlogn)
。空间复杂度为O(logn)
,排序需要O(logn)
的空间,java和js字符串是不可变的,需要额外的O(n)
空间来拷贝字符串,我们忽略这个复杂度,这依赖不同语言实现的细节。
方法2.哈希表:
- 思路:采用空间换时间的策略,准备一个数组,循环字符串s,每个元素出现一次加1,然后循环t元素,每次出现的字符减1,如果t中出现一些不在s中的字符 则返回false,所有循环结束 说明两个字符串中每个字符的数量相同
- 复杂度分析: 时间复杂度
O(n)
,n是字符串的长度,空间复杂度O(s)
,s为字符集大小
js:
var isAnagram = function(s, t) {
if (s.length !== t.length) {
//长度不想等 直接返回false
return false;
}
const table = new Array(26).fill(0);//大小为26的数组
for (let i = 0; i < s.length; ++i) {
//循环字符串s,每个元素出现一次加1
table[s.codePointAt(i) - 'a'.codePointAt(0)]++;
}
for (let i = 0; i < t.length; ++i) {
//循环t元素
table[t.codePointAt(i) - 'a'.codePointAt(0)]--;//每次出现的字符减1
//如果t中出现一些字符对于s中的字符 则返回false
if (table[t.codePointAt(i) - 'a'.codePointAt(0)] < 0) {
return false;
}
}
return true;//所有循环结束 说明两个字符串中每个字符的数量相同
}