编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 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-