前端练习09 同字母异序

Leetcode初级算法练习。

题目

同字母异序指的是两个字符串字母种类和字母的数量相同,但是顺序可能不同。

完成isAnagram,接受两个字符串作为参数,返回true或者false表示这两个字符串是否同字母异序。例如:

1
2
isAnagram("anagram", "nagaram") // => return true.
isAnagram("rat", "car") // => return false.

实现1

我实现的方案还是比较简单的,排序一下在比较就行了

1
const isAnagram = (str1, str2) => [...str1].sort().join('') === [...str2].sort().join('')

还可以:

1
const isAnagram = (str1, str2) =>  str1.length === str2.length && ![...str1].find(v => !str2.includes(v)) && ![...str2].find(v => !str1.includes(v));

还可以使用for循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const isAnagram = (str1, str2) => {
if (str1.length !== str2.length) {
return false;
}
let str2Copy = str2;
for (let i = 0; i < str1.length; i++) {
if (!str2Copy.includes(str1[i])) {
return false;
} else {
const str2CopyArr = [...str2Copy];
str2CopyArr.splice(str2Copy.indexOf(str1[i]), 1);
str2Copy = str2CopyArr.join('')
}
}
return str2Copy.length === 0
};

实现2

在LeetCode上又遇到了这道题,看了大神的代码,自愧不如。

想要执行用时短,要避免类型转换,所以直接使用了replace方法,这样就可以实现同样字母的替换

1
2
3
4
5
6
7
8
var isAnagram = function (s, t) {
while (s !== t && s.length === t.length) {
const reg = new RegExp(s[0], 'g');
s = s.replace(reg, '');
t = t.replace(reg, '');
}
return s === t
};

执行用时116ms,而原先的方法最少都在150ms以上

实现3

因为题目中注明了,可以假设字符串只包含小写字母,那收到另外一个题目的其他,也可以对一个常量字符串进行遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var isAnagram = function (s, t) {
if(s.length !== t.length) {
return false;
}
const alpha = 'abcdefghijklmnopqrstuvwxyz';
let reg;
for (let i = 0; i < alpha.length; i++) {
const letter = alpha[i],
sIndex = s.indexOf(letter),
tIndex = t.indexOf(letter);
if ((sIndex === -1 && tIndex !== -1) || (sIndex !== -1 && tIndex === -1)) {
return false;
} else {
reg = new RegExp(letter, 'g');
s = s.replace(reg, '');
t = t.replace(reg, '');
if (s === t) {
return true
}
if(s.length !== t.length) {
return false
}
}
}
return s === t;
};

执行用时104ms。

参考