携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 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
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 提交记录如下:
- 时间复杂度:O(n),n为sentence长度
- 空间复杂度:O(1),只需要额外的常数级别的空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~