【LeetCode】1455. 检查单词是否为句中其他单词的前缀

277 阅读3分钟

image.png

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

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

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

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 1 <= sentence.length <= 100
    • 1 <= searchWord.length <= 10
    • sentence 由小写英文字母和空格组成。
    • searchWord 由小写英文字母组成。

二、思路分析:

我们拿到本题,题目要求对单词字符串中找出指定单词前缀的单词位置,题目给出的单词字符串特点如下:

  • 字符串sentence是由小写英文字符和空格组成
  • searchWord 是由小写英文字母组成
  • 当指定的单词前缀存在多个单词时,则结果取最小下标值
  • 当指定的单词前缀,sentence中不存在,则结果返回-1

根据以上说明,我们能够使用字符串分片/双指针/正则等方法解答,各个方法思路如下:

  • 方法一:字符串分片

    • 根据sentence字符串的特点,每一个单词之间是由空格连接,因此我们可以直接使用split()方法,以空格的方式将单词分割出来sentencelist
    • 再使用for循环对sentencelist遍历字符串sent
    • 当sent[:len(searchWord)]与searchword相等,则返回结果idex+1
    class Solution(object):
        def isPrefixOfWord(self, sentence, searchWord):
            """
            :type sentence: str
            :type searchWord: str
            :rtype: int
            """
            sentencelist = sentence.split(" ")
            for idex,sent in enumerate(sentencelist):
                if searchWord == sent[:len(searchWord)]:
                    return idex+1
            return -1
    
  • 方法二:双指针

    • 方法一中,我们使用split()方法来分割出每一个单词,用一个临时列表存储。其实我们可以使用双指针来替换此方法。
    • 定义两个指针i和search,指针i遍历sentence字符串,search记录遇到的每一个单词
    • 当sentence[i]不是空字符时,说明当前是单词类型,使用while循环遍历单词中字符
    • 当 sentence[i]==searchWord[search]时,i指针继续向右移动+1,search指针也+1
    • 当 len(searchWord) == search时,则返回ans结果
    • 再使用while遍历完后序单词字符,i继续向右移动+1,直到遇到空字符为止
    • 当sentence[i] 为空字符时,则i向右移动+1 流程图 (11).jpg
      class Solution(object):
          def isPrefixOfWord(self, sentence, searchWord):
              """
              :type sentence: str
              :type searchWord: str
              :rtype: int
              """
              ans = 0
              i = 0
              while i < len(sentence):
                  search = 0
                  if sentence[i] != " ":
                      ans +=1
                      while i < len(sentence) and sentence[i] == searchWord[search]:
                          i +=1
                          search +=1
                          if len(searchWord) == search:
                              return ans
                      while i < len(sentence) and sentence[i] != " ":
                          i +=1
                  else:
                      i +=1
              return -1
      
  • 方法三:正则match查找

  • 任何关于字符串的问题,我们都可以使用正则解决

    • 本题中需要找到符合指定前缀的单词位置,则我们可以使用re.match()方法
    • re.match()方法是从指定单词中开始位置进行匹配的,如果符合则返回True,否则False
    • 因此对方法一中,for循环遍历的if判断条件替换成re.match(searchWord,sent)
    class Solution(object):
        def isPrefixOfWord(self, sentence, searchWord):
            """
            :type sentence: str
            :type searchWord: str
            :rtype: int
            """
            sentencelist = sentence.split(" ")
            for idex,sent in enumerate(sentencelist):
                if re.match(searchWord,sent):
                    return idex+1
            return -1
    

三、总结:

本题中考察对字符串遍历处理。对于每一个单词分割,我们可以直接调用split()方法快速实现,但是我们也要掌握其查找的过程(双指针遍历),AC 提交记录如下: image.png

  • 时间复杂度:O(n),n为sentence长度
  • 空间复杂度:O(1),只需要额外的常数级别的空间

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