前言
今天带大家刷一下Leetcode
效的字母异位词,话不多说,我们直接上题。
题目描述
这道题定义为简单题目,我想着应该不难,我直接遍历其中一个字符串,判断每个字符是不是在另一个字符串中,如果在就把出现的第一个位置对应的字符串删除,最后看看是不是字符串是不是空就行了,于是自信满满的写下了以下代码。
var isAnagram = function(s, t) {
if(s.length!==t.length) return false
let tArr = t.split('')
for(let i = 0;i< s.length;i++){
const index = tArr.indexOf(s[i])
if(index > -1){
tArr.splice(index,1)
} else {
continue
}
}
return tArr.length === 0
};
通过倒是通过了,就是结果有点不理想,没有想到indexOf
内部也是用的循环实现的,时间复杂度为n^2
。
哈希解法
既然时间复杂度为n^2
不理想,我们就得在循环上想办法,无非就是用空间换时间。于是我们可以定义一个长度为26的数组(26个字母),第一次循环统计每个字母出现的次数,第二次循环第二个字符串,依次相减,最后统计数组中是否有字母统计的次数不为0,如果有则返回false
,没有就返回true
。
var isAnagram = function(s, t) {
const countArr = new Array(26).fill(0)
const zero = 'a'.charCodeAt()
for(let i = 0;i<s.length;i++){
countArr[s[i].charCodeAt() - zero]++
}
for(let i = 0;i<t.length;i++){
countArr[t[i].charCodeAt() - zero] --
}
for(let i = 0;i<countArr.length;i++) {
if(countArr[i]!==0){
return false
}
}
return true
};
执行结果
我们通过比较每个字母与a
的ASCII
值的差值来代表每个字母的位置,原理还是hash
表,只是通过数组的方式表示我们处理起来比较方便。虽然使用了三次for
循环,但是时间复杂度仍然为n
,从执行结果来看,执行用时也有非常显著的减少。
最后
今天的内容到此结束,喜欢就点个赞吧。