1. 程式人生 > >最長公共字首的golang實現

最長公共字首的golang實現

編寫一個函式來查詢字串陣列中的最長公共字首。

如果不存在公共字首,返回空字串 ""。

輸入: ["flower","flow","flight"]
輸出: "fl"
輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共字首。

首先理解題意:

  • 當源字串陣列中一個元素也沒有,那肯定是返回空字串了
        slen := len(strs)
        //特殊情況,當切片中沒有任何元素的時候返回""
        if slen==0{
            return ""
        }
  • 而最壞的情況就是得到源陣列中長度最小的字串,那我們就要找到最小長度的字串了
    //找出最小長度的字串、字串長度以及索引
    minLen := math.MaxInt32
    minIndex := 0
    minLenStr := ""
    for i := 0; i < slen; i++ {
        if len(strs[i]) < minLen {
            minLen = len(strs[i])
            minIndex = i
            minLenStr = strs[i]
        }
    }
  • 然後我們就可以對源字串中的每一個元素與最小長度的那個字串比較了,但是考慮到空間和時間的問題,我們可以先把源字串中的那個最小長度的字串去掉,然後再進行比較
        //
    先對上面得到的最小長度的字串進行for迴圈,得到每一個字元 //然後對源切片strs剩下的元素進行for迴圈,得到strs中每個元素的第一位字元,與最小長度得到的字元相比 //最後把相同的字元加到返回值中去 for _, c := range minLenStr { for z := 0; z < len(strs); z++ { if string(c) == string(strs[z][0]) { strs[z] = strs[z][1:] } else {
    return result } } result += string(c) } return result

    這裡有個小技巧,就是每次只比對源字串陣列剩下的元素的第一位,如果是與最小字串對應位置的一樣,那我們就把源字串陣列對應的元素去除掉第一個字元

    整體程式碼:
    func longestCommonPrefix(strs []string) string {
        result := ""
        slen := len(strs)
        //特殊情況,當切片中沒有任何元素的時候返回""
        if slen==0{
            return ""
        }
    
        //找出最小長度的字串、字串長度以及索引
        minLen := math.MaxInt32
        minIndex := 0
        minLenStr := ""
        for i := 0; i < slen; i++ {
            if len(strs[i]) < minLen {
                minLen = len(strs[i])
                minIndex = i
                minLenStr = strs[i]
            }
        }
    
        //在strs去除掉長度最小的字串
        strs = append(strs[:minIndex], strs[minIndex+1:]...)
    
        //先對上面得到的最小長度的字串進行for迴圈,得到每一個字元
        //然後對源切片strs剩下的元素進行for迴圈,得到strs中每個元素的第一位字元,與最小長度得到的字元相比
        //最後把相同的字元加到返回值中去
        for _, c := range minLenStr {
            for z := 0; z < len(strs); z++ {
                if string(c) == string(strs[z][0]) {
                    strs[z] = strs[z][1:]
                } else {
                    return result
                }
            }
            result += string(c)
        }
        return result
    }

    當然我們也有另外一種思考方式,那就是比較不一樣的,當不一樣,那我們就返回源切片的對應元素的對應索引,不然就直接返回最小長度的字串

        for i, c := range minLenStr {
            for z := 0; z < len(strs); z++ {
                if strs[z][i] != byte(c) {
                    return strs[z][:i]
                }
            }
        }
        return minLenStr