有效的字母异位词
一、LeetCode题解
瞧一瞧~
- 博健的LeetCode题解:Gitbook版本传送门
- 博健的LeetCode题解:CSDN传送门
- 前端进阶笔记:Gitbook传送门
二、算法题
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入:`s = "anagram", t = "nagaram"`
输出: `true`
示例2
输入: `s = "rat", t = "car"`
输出: `false`
你可以假设字符串只包含小写字母。
解法一(暴力删除)
- 为了方便删除,将字符串转换成数组
- 一一查找两个数组的元素,有相等的就删除
- 如果满足题需求,则数组长度以应为0
代码
var isAnagram = function(s, t) {
if(s.length !== t.length) return false;
var arrS = s.split('')
var arrT = t.split('')
for(let i = 0; i < arrS.length; i++){
let index = arrT.indexOf(arrS[i])
if(index !== -1){
arrS.splice(i, 1)
arrT.splice(index, 1)
i--
}
}
return arrS.length == 0
};
解法二 (排序)
- 利用ascii码排序
- 比较两个字符串是否相等
- 我们利用快排的话时间负责度应该是 O(n*logn)
- PS:这里我没有使用快排,所以也不是排序最优解
代码
var isAnagram = function(s, t) {
if(s.length !== t.length) return false;
var arrS = s.split('').sort()
var arrT = t.split('').sort()
for(let i = 0; i < arrS.length; i++){
if(arrS[i] != arrT[i])
return false
}
return true
};
结果
解法三 (Map)
- 对每一个字符串进行map的建立,读取每一种字母出现的次数
- 循环比较两个Map的key对应的次数是否相等
代码
var isAnagram = function(s, t) {
if(s.length !== t.length) return false;
var objS = {},objT = {}
for(let i = 0; i < s.length; i++){
if(objS[s[i]]){
objS[s[i]] += 1
}else{
objS[s[i]] = 1
}
if(objT[t[i]]){
objT[t[i]] += 1
}else{
objT[t[i]] = 1
}
}
for(let key in objS){
if(objS[key] != objT[key]) return false
}
return true
};