题目
给你一个下标从 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]由小写英文字母组成
思路
这周的题目前三题有点水了…
先将数组的字符串都添加到结果集,然后「倒着」遍历数组的字符串,如果和前一个字符串是异位词,那么在结果集中删除该下标的字符串。
倒着遍历是因为删除了一个字符串前面的下标不会影响,如果正着删除就会影响。
代码
class Solution {public List<String> removeAnagrams(String[] words) {List<String> ans = new ArrayList<>(Arrays.asList(words));int n = words.length;for (int i = n - 1; i >= 1; i--) {char[] a = words[i].toCharArray();char[] b = words[i - 1].toCharArray();Arrays.sort(a);Arrays.sort(b);if (Arrays.equals(a, b)) {ans.remove(i);}}return ans;}}
