JavaScript算法24- 移除字母异位词后的结果数组(leetCode:5234)周赛

移除字母异位词后的结果数组


一、题目

给你一个下标从 0 开始的字符串 words ,其中 words[i] 由小写英文字符组成。

在一步操作中,需要选出任一下标 i ,从 words删除 words[i] 。其中下标 i 需要同时满足下述两个条件:

  1. 0 < i < words.length
  2. words[i - 1] words[i] 字母异位词

只要可以选出满足条件的下标,就一直执行这个操作。

在执行所有操作后,返回 words 。可以证明,按任意顺序为每步操作选择下标都会得到相同的结果。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。例如,"dacb""abdc" 的一个字母异位词。

示例 1:

输入:words = ["abba","baba","bbaa","cd","cd"]
输出:["abba","cd"]
解释:
获取结果数组的方法之一是执行下述步骤:
- 由于 words[2] = "bbaa" 和 words[1] = "baba" 是字母异位词,选择下标 2 并删除 words[2] 。
  现在 words = ["abba","baba","cd","cd"] 。
- 由于 words[1] = "baba" 和 words[0] = "abba" 是字母异位词,选择下标 1 并删除 words[1] 。
  现在 words = ["abba","cd","cd"] 。
- 由于 words[2] = "cd" 和 words[1] = "cd" 是字母异位词,选择下标 2 并删除 words[2] 。
  现在 words = ["abba","cd"] 。
无法再执行任何操作,所以 ["abba","cd"] 是最终答案。

示例 2:

输入:words = ["a","b","c","d","e"]
输出:["a","b","c","d","e"]
解释:
words 中不存在互为字母异位词的两个相邻字符串,所以无需执行任何操作。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 10
  • words[i] 由小写英文字母组成

二、题解

思路

  1. 遍历words 数组,如果 words[i]words[i - 1] 不互为字母异位词,就将 words[i] 插入到结果数组

  2. 关键点:如何判断两个单词是否互为字母异位词?

    • 先判断两个单词长度是否相等,不相等直接返回false
    • 利用map,存储第1个单词中每个字母出现的个数
    • 遍历第2个单词的字母,map中对应字母的value减1;若map中未存储该字母,或该字母value为0,返回false

实现

/**
 * @param {string[]} words
 * @return {string[]}
 */
var removeAnagrams = function (words) {
    if (words.length < 2) return words
    let res = [words[0]]
    for (let i = 1; i < words.length; i++) {
        if (!isMatch(words[i - 1], words[i])) {
            res.push(words[i])
        }
    }
    return res
};

// 判断是否为字母异位词
let isMatch = function (str1, str2) {
    if (str1.length !== str2.length) return false
    // 统计str1中每个字符出现的次数
    const m = new Map();
    for (let i = 0; i < str1.length; i++) {
        if (m.get(str1[i])) {
            m.set(str1[i], m.get(str1[i]) + 1)
        } else {
            m.set(str1[i], 1)
        }
    }
    // str2对比
    for (let j = 0; j < str2.length; j++) {
        if (m.get(str2[j])) {
            m.set(str2[j], m.get(str2[j]) - 1)
        } else {
            return false
        }
    }
    return true
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值