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

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

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


一、题目

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

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

0 < i < words.lengthwords[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 <= 1001 <= words[i].length <= 10words[i] 由小写英文字母组成 二、题解

思路

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

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

先判断两个单词长度是否相等,不相等直接返回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
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/924778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存