• 图解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:暴力破解(一)

    1. class Solution {
    2.     public List<String> stringMatching(String[] words) {
    3.         List<String> result = new ArrayList();
    4.         for (int i = 0; i < words.length - 1; i++) {
    5.             for (int j = i + 1; j < words.lengthj++) {
    6.                 if (words[i].length() >= words[j].length() && words[i].contains(words[j]) && !result.contains(words[j])) {
    7.                     result.add(words[j]);
    8.                 } else if (words[i].length() < words[j].length() && words[j].contains(words[i]) && !result.contains(words[i])) {
    9.                     result.add(words[i]);
    10.                 }
    11.             }
    12.         }
    13.         return result;
    14.     }
    15. }

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

    1. class Solution {
    2.     public List<String> stringMatching(String[] words) {
    3.         List<String> ret = new ArrayList();
    4.         for (int i = 0; i < words.length; i++) {
    5.             for (int j = 0; j < words.length; j++) {
    6.                 if (i != j && words[j].contains(words[i])) {
    7.                     ret.add(words[i]);
    8.                     break;
    9.                 }
    10.             }
    11.         }
    12.         return ret;
    13.     }
    14. }

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 相关阅读:
    快手一面:优化MySQL索引创建,减轻线上服务影响
    norflash 中块和扇区的关系
    jQuery 效果- 隐藏和显示
    云音箱工作原理
    Docker 入门版
    动态规划——最长上升子序列模型
    OpenCV DNN 活体检测项目环境配置等各阶段tips
    作为SiteGPT替代品,HelpLook的优势是什么?
    瑞_Redis_商户查询缓存_添加Redis缓存&缓存更新策略
    CentOS 编译安装 nginx
  • 原文地址:https://blog.csdn.net/qq_26470817/article/details/126203571