异位词:组成字母一样,顺序不一样。
例如:hello 和 olehl.
解题思路
1.两个for循环硬解,时间复杂度O(n2),不建议使用,面试官也不想要这种解法。 2.遇到这种需要快速定位某个值得方法可以使用空间换时间,使用哈希表或者对象,保存查过的值,用于快速定位。
看了下面两个解法就明白了了
解法一
使用一个对象,遍历一个字符串时候保存遍历字符的个数;遍历第二个字符串时候先判断字符在对象中存不存,不存在就说明这个字符上面一个字符串没有直接结束。有的话就减少1个,这个是为了一个字符重复出现。
function fn2(s, t){
let obj = {};
if(s.length !== t.length){
return false;
}
for(let val of s){
obj[val]?obj[val]++:obj[val] = 1
}
console.log(obj)
for(let val of t){
if(!obj[val]){
return false;
}
obj[val]--
}
return true;
}
解法二
使用哈希表,创建一个26个长度的数组(如果有大小不同的字符就创建52个,还需要判断一下字符的大小写)。
字符在ASCll码表中是连续的,所以可以使用这种方式。
function fn(s, t) {
if(s.length !== t.length){
return false;
}
let ret = new Array(26).fill(0);
let base = 'a'.charCodeAt();
for(let val of s){
ret[val.charCodeAt() - base] ++
}
for(let val of t){
if(!ret[val.charCodeAt() - base]){
return false;
}
ret[val.charCodeAt() - base] --
}
return true;
}