算法:最长公共前缀

 编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }

    //第一个字符串
    prefix := strs[0]
   //字符串数组的长度
    count := len(strs)

   //prefix 就是表示最长公共前缀
    for i := 1; i < count; i++ {
       //prefix和strs[i]最长公共前缀
        prefix = lcp(prefix, strs[i])
        if len(prefix) == 0 {
            break
        }
    }
    return prefix
}

func lcp(str1, str2 string) string {
    length := min(len(str1), len(str2))
    index := 0
    for index < length && str1[index] == str2[index] {
        index++
    }
    return str1[:index]
}

func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

//-----------------------------------------------------
func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }

    //遍历第一个字符串中的每个字符
    for i := 0; i < len(strs[0]); i++ {
        //遍历字符串数组中的每个字符串
        for j := 1; j < len(strs); j++ {
            if i == len(strs[j]) || strs[j][i] != strs[0][i] {
                return strs[0][:i]
            }
        }
    }

    //以第一个字符串为基准
    return strs[0]
}

//分治
func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }

    var lcp func(int, int) string
    lcp = func(start, end int) string {

        if start == end {
            return strs[start]
        }

        //取中间位字符串
        mid := (start + end) / 2
        //分别取左半边和右半边的最长公共串
        lcpLeft, lcpRight := lcp(start, mid), lcp(mid + 1, end)

        //取较小的长度
        minLength := min(len(lcpLeft), len(lcpRight))

        //比较两个公共串是否相等   
        for i := 0; i < minLength; i++ {
            if lcpLeft[i] != lcpRight[i] {
                return lcpLeft[:i]
            }
        }

        return lcpLeft[:minLength]

    }

    //传入字符串两端
    return lcp(0, len(strs)-1)
}


func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

//-----------------------------------------------------------------------------------
//二分
func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }

    isCommonPrefix := func(length int) bool {
        str0, count := strs[0][:length], len(strs)

        //count是字符串数组的长度
        for i := 1; i < count; i++ {
            if strs[i][:length] != str0 {
                return false
            }
        }
        return true
    }

    //第一个字符串的长度
    minLength := len(strs[0])

    //求出最短字符串长度
    for _, s := range strs {
        if len(s) < minLength {
            minLength = len(s)
        }
    }

   

    low, high := 0, minLength
    for low < high {
        mid := (high - low + 1) / 2 + low
        if isCommonPrefix(mid) {
            low = mid
        } else {
            high = mid - 1
        }
    }

    return strs[0][:low]
}


参考地址:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-

上一篇:NC55最长公共前缀


下一篇:最长公共前缀_字符串_简单