Leetcode-28. 实现 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() 定义相符。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-strstr 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

遍历每一个haystack的字符,以此为起点和needle匹配,匹配成功,则返回遍历下标;否则返回-1

实现代码

func strStr(haystack string, needle string) int {
    hay_len := len(haystack)
    ne_len := len(needle)
    for i:=0; i < hay_len-ne_len+1; i++ {
       //判断haystack[i]开头是否和needle匹配
       if(isStrEqual(haystack[i:], needle)){
           return i
       }
    }
    return -1
}

func isStrEqual(str1 string, str2 string) bool {
    length := len(str2)
    flag := true
    for j:=0; j<length ;j++ {
        if(str1[j] != str2[j]) {
            flag = false
            break
        }
    } 
    return flag
}

总结

书写代码在一开始的时候没有注意到haystack的遍历区间是

len(haystack) - len(needle)+1,遍历到尾部是没必要且麻烦的

避免这种情况就是当我有了基本思路后,是会有好多漏洞的,实现方法要想一次最优且简洁就要把所有的测试用例列出来,不要光用脑子想,要写在纸上

然后把脑子里的思路转成代码,和用例一一对应

进一步的优化(未完待补坑)

上面代码的时间复杂度为O((N-L)*L)

优化方案一:hash省去L长度是否匹配判断

之所以复杂是因为遍历每一字符都要比较L长度判断是否匹配

这个*L可以转化为O(1)

方法就是用hash值,我们对字符进行编码,生成唯一值

这样每次判断匹配时就转化为计算hash值了

优化方案二:KMP字典匹配方法不用遍历源字符串每个字符了,节省时间

这个查了资料比较复杂,等以后有时间不用,挖个坑QAQ


Be Water, My Friend.