【刷题日记】1455. 检查单词是否为句中其他单词的前缀

简介: 【刷题日记】1455. 检查单词是否为句中其他单词的前缀

本次刷题日记的第 103 篇,力扣题为:1455. 检查单词是否为句中其他单词的前缀

一、题目描述:

来刷一道每日一题,1455. 检查单词是否为句中其他单词的前缀

image.png

二、这道题考察了什么思想?你的思路是什么?

题目虽然文字不少,但是表达的东西实际上就那么几件事

  • 题目给出 sentence ,是一个字符串,里面是英文句子,用空格将单词进行隔开
  • 题目还给了一个 searchWord 字符串,用来判断 searchWord 是否是 sentence 中的任意单词的前缀
  • 最后要求我们输出在 sentence 中 第一个匹配到 searchWord 前缀的单词位置,单词位置在 sentence 中的位置是从 1 开始的,如果没有匹配到,那就直接返回 -1

分析

看了这道题虽然说是挺简单的,但是我相信会不会有很多兄弟看到题的第一反应是去将 sentence 里面的单词切割出来,放到数组里面,然后进行遍历新的单词数组,逐个与 searchWord 来进行比较呢

这样子做也不是不行,只不过咱们引入了额外的非 常数级别的空间消耗

实际仔细看这个题的要求,并没有存储的要求,咱们直接去遍历题目给出的 sentence ,并且想办法在遍历的过程中将单词切割出来,再与 searchWord 进行匹配一下就可以了

因为,题目要求我们如果 sentence 中有多个都匹配到 searchWord 前缀的单词,那么取第一个,因此实际上,我们找到一个就不用往后找了,则咱们直接从 sentence 头进行遍历即可

image.png

就图中可以知道,咱们获取单词的方式,同理,其他的单词获取方式也是如此,对于判断某个单词的前缀是否是 searchWord ,咱们可以直接调用库函数,也可以自己写

判断前缀的时候,只有当 searchWord 和 单词的前 len(单词) 个字符对应相等的时候,我们才能判断 searchWord 是单词的前缀,其余情况,咱们一律不算

image.png

那么,接下来就用上述说道的双指针的方式来手撸代码吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

  • 遍历 sentence
  • 获取到每一个单词(记录单词的 start and end 指针即可)
  • 判断 searchWord 是否是单词的前缀,如果是则返回 具体的单词位置,如果不是则继续遍历

对于判断前缀,我们可以使用 golang 的 strings.HasPrefix() 函数,当然也可以自定一个判断前缀的函数都是可以的,看自己的需求和想法了

编码如下:

func isPrefixOfWord(sentence string, searchWord string) int {
    // 简单使用双指针的方式,减少空间复杂度
    index := 1  // 标识单词的位置
    n := len(sentence)
    for i:=0; i<n; i++ {
        // 单词的起始位置
        start := i 
        for i<n && sentence[i] != ' '{
            i++
        }
        // 判断到当前 i 索引对应的值为 空格,即一个单词的分割点
        end := i
        // 开始判断 searchWord 是否是 上述单词的前缀
        // if strings.HasPrefix(sentence[start:end], searchWord)
        if myHasPrefix(sentence[start:end], searchWord) {
            return index
        }
        index++
    }
    return -1
}
func myHasPrefix(nums string, str string)bool{
    nLength := len(nums)
    mLength := len(str)
    if nLength == 0 || mLength == 0 {
        return false
    }
    i := 0
    for i< nLength && i<mLength{
        if nums[i] != str[i]{
            return false
        }
        i++
    }
    if i == mLength{
        return true
    }
    return false
}

、总结:

image.png

本题咱们的这种处理方式,是将 sentence 全部都遍历了一遍,因此时间复杂度是 O(n)

空间复杂度是常数级别的 O(1) ,咱们没有引入多余的其他级别的空间消耗

原题地址:1455. 检查单词是否为句中其他单词的前缀


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
2月前
|
算法
算法编程(二十五):检查单词是否为句中其他单词的前缀
算法编程(二十五):检查单词是否为句中其他单词的前缀
38 0
|
2月前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
19 2
|
12月前
|
Cloud Native
【刷题日记】316. 去除重复字母
本次刷题日记的第 42 篇,力扣题为:316. 去除重复字母 ,中等
|
12月前
|
Cloud Native
【刷题日记】30. 串联所有单词的子串
本次刷题日记的第 75篇,力扣题为:30. 串联所有单词的子串 ,困难
|
2月前
|
缓存
牛客网刷题总结(如何清除缓存区,字母大小写替换的两种方法,一元二次方程解的输出)
牛客网刷题总结(如何清除缓存区,字母大小写替换的两种方法,一元二次方程解的输出)
28 0
|
12月前
|
Go C++ Cloud Native
【刷题日记】744. 寻找比目标字母大的最小字母
本次刷题日记的第 23 篇,力扣题为:744. 寻找比目标字母大的最小字母 ,简单
|
算法 C++ Python
每日算法系列【LeetCode 424】替换后的最长重复字符
每日算法系列【LeetCode 424】替换后的最长重复字符
每日三题-子集、单词搜索、删除无效的括号
每日三题 子集 单词搜索 删除无效的括号
63 1
每日三题-子集、单词搜索、删除无效的括号
LeetCode每日一题-9:替换后的最长重复字符串
LeetCode每日一题-9:替换后的最长重复字符串