判断两个字符串是否异位词

449 阅读1分钟

异位词:组成字母一样,顺序不一样。
例如: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;
}