移除字母异位词后的结果数组
一、题目
给你一个下标从 0 开始的字符串 words
,其中 words[i]
由小写英文字符组成。
在一步 *** 作中,需要选出任一下标 i
,从 words
中 删除 words[i]
。其中下标 i 需要同时满足下述两个条件:
0 < i < words.length
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]
由小写英文字母组成
二、题解
思路
遍历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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)