算法_两个字符串是变位词

两个字符串是变位词

难度:简单

描述:

写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串。

样例:

给出 s = “abcd”,t=”dcab”,返回 true.
给出 s = “aacd”, t = “acdd”, 返回 false.
给出 s = “abcd”, t = “dcaba”, 返回 false.
给出 s = “abcd”, t = “abce”, 返回 false.

思路分析:

想出了两种解法:分别是用对象和用数组。

要注意出现重复字符串的情况:aaccdd这类的。

代码模板:

1
2
const anagram = function (s, t) {
}

想一想再看答案

想一想再看答案

想一想再看答案

代码:

  1. 用对象来接字符,将重复的字符的数量,比较第二个字符串的数量和值
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
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. 一个字符串用来匹配,第二个字符串转数组,将找到的字符值设为undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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'))

鼓励我一下:

觉得还不错的话,给我的点个star

听说,打赏我的人最后都找到了真爱。