【LeetCode】 数组中的字符串匹配 Java 题解
题目描述
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。
复制代码
思路分析
今天的算法题目是字符串数组匹配题目,题目稍微有些繁琐,简单理解就是求字符串 words[i]的子串的个数。
分析题目,求子串,我们可以明显得到长度短的字符串可能是长度长的字符串的子串。根据这个结论,我们使用数组排序,按照字符串的长度进行升序排序。在代码实践中,就是重载 Comparator,实现自定义的排序操作。
对于排序完成的字符串数组,我们可以使用排序的方式,先从尾部取出 words[i],在从头部开始,依次取出 words[j], 判断 words[j] 是不是 words[i]的子串即可。
这里需要注意的是,在返回的结果中,words 字符串不能重复,需要注意一下去重。具体实现代码如下,供参考。
通过代码
复制代码
总结
上述算法的时间复杂度是 O(n log (n)), 空间复杂度是 O(n)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/4e68075da04564d315d30e3f3】。文章转载请联系作者。
评论