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