给你一个字符串数组 words
,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words
中是其他单词的子字符串的所有单词。
如果你可以删除 words[j]
最左侧和/或最右侧的若干字符得到 word[i]
,那么字符串 words[i]
就是 words[j]
的一个子字符串。
【输入】words = ["mass","as","hero","superhero"]
【输出】["as","hero"]
【解释】"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。["hero","as"] 也是有效的答案。
【输入】words = ["leetcode","et","code"]
【输出】["et","code"]
【解释】"et" 和 "code" 都是 "leetcode" 的子字符串。
【输入】words = ["blue","green","bu"]
【输出】[]
1
<= words.length <=100
1
<= words[i].length <=30
words[i]
仅包含小写英文字母。- 题目数据 保证 每个
words[i]
都是 独一无二 的。
首先,我们以双层for循环来遍历对比数组中的字符串,例如,当第一层for循环遍历到“leetcoder
”时,我们会将其遍历“leetcoder”之后的所有字符串,那么当要对比两个字符串的是,需要先判断哪一个字符串长度较长,那么就调用该字符串的contains(...)
方法来判断另外一定字符串是否是其子串,如果满足条件,那么将这个子串放入到List
集合中。当然,这里面也有个前提,就是要避免放入重复的字符串,所以,需要先判断result集合中是否contains这个子串,如果不包含,才会向result集合中插入这个子串。
下面,我们会以words=["leetcoder", "leetcode", "od", "hamlet", "am"]
为例,看一下具体的操作过程是怎么样的:
在第二个解题思路中,依然是采用暴力破解的方式,但是与第一种不同的点是,从数组中第一个字符串开始,每次获取一个字符串,然后与其他字符串进行对比(即:除了自己),那么只要发现这个字符串是对方的子串了,那么就终止遍历,即可将这个子串加入到List
集合中。
下面,我们依然以words=["leetcoder", "leetcode", "od", "hamlet", "am"]
为例,看一下具体的操作过程是怎么样的。首先,我们获取数组中的第一个字符串“leetcoder”,让它与其他字符串作比较,来判断“leetcoder”是否是对方的子串,那么遍历完其他字符串之后,发现,都不满足成为对方子串的条件,那么本次循环结束。那么第二个我们拿“leetcode”去与其他字符串做比较,当对比数组中第一个字符串“leetcoder”的时候,就满足了“leetcode”是“leetcoder”的判断条件,因为已经确定了”leetcode“就是满足条件的,那么将其加入到result集合中,并且直接结束循环操作。第三个我们拿”od“与其他字符串做比较,它的结果与上面类似,都是在遍历第一个元素“leetcoder”就满足了od是其子串的条件,那么同样将od加入到result集合中,并结束本次循环。上面介绍的这三个步骤可以参照下图演示:
既然介绍了前三次循环操作,那么第四次和第五次循环操作就不言而喻了,与上面描述的相似,结果是第四次循环中,判断出hamlet不是任何字符串的子串,所以不满足条件,不会将其放入到result集合中。而最后一次循环字符串“am”,是可以成为“hamlet”的子串的,所以满足需求,中断遍历并将其加入到result集合中。至此,所有循环判断结束。那么result集合中得出的最终结果就是——“leetcode”、“od”和“am”。
- class Solution {
- public List<String> stringMatching(String[] words) {
- List<String> result = new ArrayList();
- for (int i = 0; i < words.length - 1; i++) {
- for (int j = i + 1; j < words.length; j++) {
- if (words[i].length() >= words[j].length() && words[i].contains(words[j]) && !result.contains(words[j])) {
- result.add(words[j]);
- } else if (words[i].length() < words[j].length() && words[j].contains(words[i]) && !result.contains(words[i])) {
- result.add(words[i]);
- }
- }
- }
- return result;
- }
- }
- class Solution {
- public List<String> stringMatching(String[] words) {
- List<String> ret = new ArrayList();
- for (int i = 0; i < words.length; i++) {
- for (int j = 0; j < words.length; j++) {
- if (i != j && words[j].contains(words[i])) {
- ret.add(words[i]);
- break;
- }
- }
- }
- return ret;
- }
- }
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」