让我们一起啃算法---- 实现 strStr

栏目: IT技术 · 发布时间: 5年前

内容简介:题干如下:实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

实现 strStr(Implement-StrStr)

题干如下:

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:

输入: haystack = "hello", needle = "ll"

输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"

输出: -1

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C语言 的 strstr() 以及 Java 的 indexOf() 定义相符。

来源:力扣

本题有很多种解题方式,为了再巩固一下 双指针解题思路 这题我们还是选用这种思路来解。

建议再结合 让我们一起啃算法----移除元素让我们一起啃算法----删除 排序 数组中的重复项 两篇文章仔细体会一下 双指针思路

解题思路

初始化 i 指向 needle 字符串的第一个字符, j 指向 haystack 字符串的第一个字符。比较 needle[i]haystack[j] 的字符是否相等:相等则 i++、j++ ;不想等则 i 重新指向 needle 字符串的第一个字符, j 指向上一次初始位置的后一个字符。

注: j 指向上一次初始位置的后一个字符的计算方式为: j = j - i + 1。可以自己造个数组,推算一下这个规律哟。

流程图如下:

让我们一起啃算法---- 实现 strStr

代码实现

GO语言实现

func strStr(haystack string, needle string) int {

    // 子串为空则返回 0
    if needle == "" {
        return 0
    }

    i := 0
    j := 0
    for j < len(haystack) {
        // 判断 haystack[j] 与 needle[i] 是否相等,不想等,则 i 重新指向 needle 字符串的首字符,即 i = 0
        // j 指向 j上一次初始化的后一个字符串,即 j = j - i + 1
        if haystack[j] != needle[i] {
            j = j - i + 1
            i = 0
        } else {
            // haystack[j] 与 needle[i] 相等,则先判断 i 是否已经最大
            // 是的话就返回 needle 在 haystack 的第一个位置,计算方式: j - i
            if i == len(needle) -1 {
                return j - i
            }
            // 如果 i 不是 needle 的最大索引,那么 j 向后移动一位,i 向后移动一位,继续比较
            j++
            i++
        }
    }
    // j 越界了,说明不存在子串 needle,即返回 -1
    return -1
}

总结

每天进步一点点,加油!

算法教程项目,每天更新一题,点个 star 支持一下呀:

https://github.com/wx-satellite/learning-a...

欢迎关注我们的微信公众号,每天学习 Go 知识

让我们一起啃算法---- 实现 strStr

以上所述就是小编给大家介绍的《让我们一起啃算法---- 实现 strStr》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大话存储Ⅱ

大话存储Ⅱ

张冬 / 清华大学出版社 / 2011-5 / 99.00元

《大话存储2:存储系统架构与底层原理极限剖析》内容简介:网络存储是一个涉及计算机硬件以及网络协议/技术、操作系统以及专业软件等各方面综合知识的领域。目前国内阐述网络存储的书籍少之又少,大部分是国外作品,对存储系统底层细节的描述不够深入,加之术语太多,初学者很难真正理解网络存储的精髓。《大话存储2:存储系统架构与底层原理极限剖析》以特立独行的行文风格向读者阐述了整个网络存储系统。从硬盘到应用程序,对......一起来看看 《大话存储Ⅱ》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具