【算法】字符串:有效的字母异位词

75 阅读1分钟

题目:

leetcode链接:有效的字母异位词

说明:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

理解:

1、有两个字符串,需判断这两个字符串是否互为字母异位词

2、那什么是字母异或位词?即两字符串由相同的字母组成且同字母的个数也一样,但是字母的顺序可能不一样。

思路:

1、先排序,然后比较两个字符串是否相等

2、维护一个长度为26的频次数组table

题解:

方案一:先排序再比较

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    var ss = [...Array.from(s).values()].sort()
    var tt = [...Array.from(t).values()].sort()

    return ss.join('') === tt.join('') 
};

image.png

方案二:先排序再比较-优化版

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};

image.png

方案三:维护一个长度为26的频次数组table

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    if (s.length !== t.length) {
        return false;
    }
    const table = new Array(26).fill(0);
    for (let i = 0; i < s.length; ++i) {
        table[s.codePointAt(i) - 'a'.codePointAt(0)]++;
    }
    for (let i = 0; i < t.length; ++i) {
        table[t.codePointAt(i) - 'a'.codePointAt(0)]--;
        if (table[t.codePointAt(i) - 'a'.codePointAt(0)] < 0) {
            return false;
        }
    }
    return true;
};

image.png

总结:

本篇提供了几种对于有效的字母异位词的实现,起初以为先排序再比较两个字符串的方式效率还可以,没成想,效率低的一米,看起来还是维护一个数组频次的效率要高很多。