题目:
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('')
};
方案二:先排序再比较-优化版
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};
方案三:维护一个长度为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;
};
总结:
本篇提供了几种对于有效的字母异位词的实现,起初以为先排序再比较两个字符串的方式效率还可以,没成想,效率低的一米,看起来还是维护一个数组频次的效率要高很多。