给你一个下标从 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]
由小写英文字母组成
class Solution:
def removeAnagrams(self, words: List[str]) -> List[str]:
return [
w
for i, w in enumerate(words)
if i == 0 or sorted(w) != sorted(words[i - 1])
]
class Solution {
public List<String> removeAnagrams(String[] words) {
List<String> ans = new ArrayList<>();
String prev = "";
for (String w : words) {
char[] cs = w.toCharArray();
Arrays.sort(cs);
String t = String.valueOf(cs);
if (!t.equals(prev)) {
ans.add(w);
}
prev = t;
}
return ans;
}
}
function removeAnagrams(words: string[]): string[] {
const n = words.length;
let ans = [];
ans.push(words[0]);
let pre = countWord(words[0]).join('');
for (let i = 1; i < n; i++) {
let cur = countWord(words[i]).join('');
if (pre !== cur) {
ans.push(words[i]);
pre = cur;
}
}
return ans;
}
function countWord(word: string): number[] {
let count = new Array(128).fill(0);
for (let i = 0; i < word.length; i++) {
count[word.charCodeAt(i)]++;
}
return count;
}