# 两个字符串是变位词

# 难度:简单

# 描述:

写出一个函数 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

# 想一想再看答案

# 想一想再看答案

# 想一想再看答案

# 代码:

  1. 用对象来接字符,将重复的字符的数量,比较第二个字符串的数量和值
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
26
27
28
29
30
  1. 一个字符串用来匹配,第二个字符串转数组,将找到的字符值设为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
19
20
21
22

# 点个Star支持我一下~