leetcode 28. 实现 strStr()

165 阅读1分钟

题目链接

使用KMP算法解题(已提交通过)

func strStr(haystack string, needle string) int {
    return firstIndex(haystack, needle)
}

// 在text中找pattern第一次出现的索引。如果没找到就返回-1。
// 约定:只要pattern是空字符串,就返回0
func firstIndex(text, pattern string) int {
    if pattern == "" {
        return 0
    }
    if text == "" {
        return -1
    }
    // text != "" && pattern != ""
    if len(text) < len(pattern) {
        return -1
    }
    // tl >= pl
    return indexKMP(text, pattern)
}

func indexKMP(text, pattern string) int {
    var (
        ti int
        pi int
        tl = len(text)
        pl = len(pattern)
        next = getNextArray(pattern)
    )
    for ti < tl {
        if text[ti] == pattern[pi] {
            ti++
            pi++
            if pi == pl {
                return ti-pl
            }
        } else if pi == 0 {
            ti++
            if tl-ti < pl {
                break
            }
        } else {
            pi = next[pi-1]
            if tl-ti < pl-pi {
                break
            }
        }
    }
    return -1
}

func getNextArray(p string) []int {
    // 前置条件: p不是空字符串
    if p == "" {
        panic("p is empty")
    }
    var (
        j    int // 前缀当前索引
        i    = 1 // 后缀当前索引
        l    = len(p)
        next = make([]int, l)
    )
    // next[0] = 0,隐含的初始化
    for i < l {
        if p[j] == p[i] {
            j++
            next[i] = j
            i++
        } else if j == 0 {
            next[i] = 0
            i++
        } else {
            j = next[j-1]
        }
    }
    return next
}