# 两个字符串是变位词
# 难度:简单
# 描述:
写出一个函数 anagram(s, t)
判断两个字符串是否可以通过改变字母的顺序变成一样的字符串。
# 样例:
给出 s = "abcd",t="dcab",返回 true. 给出 s = "aacd", t = "acdd", 返回 false. 给出 s = "abcd", t = "dcaba", 返回 false. 给出 s = "abcd", t = "abce", 返回 false.
# 思路分析:
想出了两种解法:分别是用对象和用数组。
要注意出现重复字符串的情况:aaccdd
这类的。
# 代码模板:
const anagram = function (s, t) {
}
1
2
2
# 想一想再看答案
# 想一想再看答案
# 想一想再看答案
# 代码:
- 用对象来接字符,将重复的字符的数量,比较第二个字符串的数量和值
const anagram = function (s, t) {
if (s.length === t.length) {
var obj = {};
for (let key of s) {
if (obj[key] === undefined) {
obj[key] = 1 // 初始化
} else {
obj[key] = obj[key]+1 // 相同的字符 增加数量
}
}
for (let key of t) {
if (obj[key] === undefined) {
return false // 出现没有值的情况 直接返回false
} else {
obj[key] = obj[key]-1 // 将值又减掉 最后全为0 才是正确
}
}
for (let key in obj) {
if(obj[key] !== 0) return false
}
return true // 每个字符一样 数量也相同 返回true
}
return false // 数量不同 返回false
}
console.log(anagram('abcd', 'dcab'), anagram('aacd', 'acdd'), anagram('abcd', 'dcaba'), anagram('abcd', 'abce'))
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 一个字符串用来匹配,第二个字符串转数组,将找到的字符值设为
undefined
const anagram = function (s, t) {
if(s.length === t.length){
t = [...t] // 一个字符串用来匹配
for(let key of s){
let index = t.indexOf(key);
if(index !== -1){
t[index] = undefined // 找到那个值 设为undefined 下次有重复的 就不会再找到
}else{
return false // 没找到即为false
}
}
return true // 数量相等 会全都删光
}else{
return false // 数量不等即为false
}
}
console.log(anagram('abcd', 'dcab'), anagram('aacd', 'acdd'), anagram('abcd', 'dcaba'), anagram('abcd', 'abce'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18