🔖

[Go/LeetCode] 28. Find the Index of the First Occurrence in a String

に公開

概要

↓の解法メモです。
https://leetcode.com/problems/find-the-index-of-the-first-occurrence-in-a-string/description/

問題概要

全体文字列 haystack と検索文字列 needle が渡されるので、文字列の中に検索文字列があればそのインデックス、なければ -1 を返します。
たとえば helloworld に対して low が渡された場合は 4 を返します。

解法

初見

Go では strings.Index がこれにあたるのでこれを使えばよいのですが、なんか悔しいので独自に実装しました。
めちゃくちゃ遅かったです。

func safeSlice(s string, start int, end int) string {
    fmt.Println(start, end)
    if end > len(s) {
        end = len(s)
    }      
    fmt.Println(start, end, s[start:end]) 
    return s[start:end]
}
func strStr(haystack string, needle string) int {
    for i:=0;i<len(haystack);i++ {
        if needle == safeSlice(haystack, i, i+len(needle)) {
            return i
        }
    }
    return -1
}

最適なコード

strings.Index を使おう。

func strStr(haystack string, needle string) int {
    return strings.Index(haystack, needle)
}

一応内部実装を見てみましたが、ケースに応じて細かい最適化がされてておもしろかったです。
https://cs.opensource.google/go/go/+/refs/tags/go1.24.5:src/internal/stringslite/strings.go;l=28

GitHubで編集を提案
Progate Path コミュニティ

Discussion