# 两个字符串是变位词

# 难度:简单

# 描述:

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

# 想一想再看答案

# 想一想再看答案

# 想一想再看答案

# 代码:

  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
  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

# 点个Star支持我一下~

最后更新时间: 8/2/2019, 12:38:18 PM