【LeetCode】 移除字母异位词后的结果数组 Java 题解
题目描述
给你一个下标从 0 开始的字符串 words ,其中 words[i] 由小写英文字符组成。
在一步操作中,需要选出任一下标 i ,从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件:
0 < i < words.lengthwords[i - 1] 和 words[i] 是 字母异位词 。只要可以选出满足条件的下标,就一直执行这个操作。
在执行所有操作后,返回 words 。可以证明,按任意顺序为每步操作选择下标都会得到相同的结果。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。例如,"dacb" 是 "abdc" 的一个字母异位词。
思路分析
今天的算法题目是数组处理题目,题目比较长,分析重点如下。1. 求字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次,这里需要注意的是,两个单词完全相同也是异位词。2. 当连续的两个单词是异位词的时候,删除前一个。
根据如上分析,我们首先实现字母异位词的代码判断,判断的时候,由于都是小写字母,我们可以使用 ASCII 知识。什么是 ASCII?ASCII 码是一套编码规范,其中 97~122 号为 26 个小写英文字母。用数组记录字符出现的次数。遍历过后,当数组出现次数都是 0 的时候,两个单词即为字母异位词。
做这个题目时候,通过观察,字母异位词可以传递,因此,我们只保留当前的单词即可。这一步很重要,不容易想到,我也是参考题解才学会的,需要好好思考。具体实现代码如下,供参考。
通过代码
总结
上述算法的时间复杂度是 O(n),空间复杂度是 O(n)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【HQ数字卡】的原创文章。
原文链接:【http://xie.infoq.cn/article/214ee8f9ca6b59d02431e7818】。文章转载请联系作者。
评论