【LeetCode】1408. 数组中的字符串匹配

939 阅读1分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

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

二、思路分析:

我们拿到本题,读取题目内容是一道关于字符串匹配,要求在数组中查询到是字符是另外一个字符的子串,结果并以字符串的形式返回。那么给出数组里面的元素是怎么样的呢,继续挖掘题目细节:

  • 题目给出的数组words的元素数据类型都是字符串
  • words的元素是仅包含小写字母的,并且每一个元素都是唯一的
  • words的长度范围在1~100之间,数据量不算大

我们通过题目示列说明且数组words的长度不大,解答该题我们可以直接使用暴力模拟方法即可。

  • 方法一: 暴力模拟

  • words数组中元素我们都要取出来与words数组中其他元素进行对比是否是其子串
  • 因此第一层for循环遍历,取出要比较大word
  • 再使用第一层for循环遍历,将取出word与word1的进行判断
  • 当word在word1中,且word的索引位置i与word1的索引位置j不一样时,则添加到ans
  • 直到第一层for循环遍历完成,并返回结果ans
     class Solution(object):
         def stringMatching(self, words):
             """
             :type words: List[str]
             :rtype: List[str]
             """
             ans = []
             for i,word in enumerate(words):
                 for j,word1 in enumerate(words):
                     if i!=j and word in word1:
                         ans.append(word)
                         break
             return ans
    
  • 方法二:字符串拼接判断

  • 因为取出words[i]要在words列表中的每一个元素查找,可以将words数组转换成字符串形式存储在tmp里面,列表转换成字符串使用" ".join(words)
  • 则只需要一个for循环将words数组中的元素取出来,字符串tmp中查找出现的次数
  • 当tmp.count(word)次数大于1次,则word肯定是另外一个字符串的子串,则添加ans
    class Solution(object):
        def stringMatching(self, words):
            """
            :type words: List[str]
            :rtype: List[str]
            """
            ans = []
            tmp = " ".join(words)
    
            for i,word in enumerate(words):
                if tmp.count(word) > 1:
                    ans.append(word) 
            return ans
    

三、总结:

本题考察我们对遍历数组字符串元素进行判断,为了少使用双for循环,我们可以将数组转换成字符串方式,只需要一个for循环,这样可以提高代码的计算速度,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为数组长度
  • 空间复杂度:O(n),需要使用到临时遍历数组字符串长度n

以上是本期内容,欢迎大佬们点赞评论,下期见~~