图解LeetCode——1408. 数组中的字符串匹配(难度:简单)

一、题目

给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。

如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。

二、示例

2.1> 示例 1:

【输入】words = ["mass","as","hero","superhero"]
【输出】["as","hero"]
【解释】"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。["hero","as"] 也是有效的答案。

2.2> 示例 2:

【输入】words = ["leetcode","et","code"]
【输出】["et","code"]
【解释】"et" 和 "code" 都是 "leetcode" 的子字符串。

2.3> 示例 3:

【输入】words = ["blue","green","bu"]
【输出】[]

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 30
  • words[i] 仅包含小写英文字母。
  • 题目数据 保证 每个 words[i] 都是 独一无二 的。

三、解题思路

3.1> 思路1:暴力破解(一)

首先,我们以双层for循环来遍历对比数组中的字符串,例如,当第一层for循环遍历到“leetcoder”时,我们会将其遍历“leetcoder”之后的所有字符串,那么当要对比两个字符串的是,需要先判断哪一个字符串长度较长,那么就调用该字符串的contains(...)方法来判断另外一定字符串是否是其子串,如果满足条件,那么将这个子串放入到List result集合中。当然,这里面也有个前提,就是要避免放入重复的字符串,所以,需要先判断result集合中是否contains这个子串,如果不包含,才会向result集合中插入这个子串。

下面,我们会以words=["leetcoder", "leetcode", "od", "hamlet", "am"]为例,看一下具体的操作过程是怎么样的:

3.2> 思路2:暴力破解(二)

在第二个解题思路中,依然是采用暴力破解的方式,但是与第一种不同的点是,从数组中第一个字符串开始,每次获取一个字符串,然后与其他字符串进行对比(即:除了自己),那么只要发现这个字符串是对方的子串了,那么就终止遍历,即可将这个子串加入到List result集合中。

下面,我们依然以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”。

四、代码实现

4.1> 实现1:暴力破解(一)

class Solution {
    public List stringMatching(String[] words) {
        List 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;
    }
}

4.2> 实现2:暴力破解(二)

class Solution {
    public List stringMatching(String[] words) {
        List 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)/ ~ 「干货分享,每天更新」

你可能感兴趣的:(图解LeetCode——1408. 数组中的字符串匹配(难度:简单))