本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""。示例 1:
输入: strs = ["flower","flow","flight"] 输出: "fl"示例 2:
输入: strs = ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。提示:
1 <= strs.length <= 2000 <= strs[i].length <= 200strs[i]仅由小写英文字母组成
思路:
-
从字符串数组中随便选一个作为被比较的prefix,比如strs[0]
-
判断prefix是否是strs数组中每个元素的子串
- 如果是,则跳过,不进入内循环
- 如果不是,则将待比较的 prefix 从后向前不断缩短,直至prefix长度减为0,或者找到了满足字符串数组中属于每个元素的最长公共前缀
-
最后返回prefix即可~(注意这里使用了go自带的库函数 strings.HasPrefix() 来判断前缀)
时间复杂度: O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
空间复杂度: O(1)
func longestCommonPrefix(strs []string) string {
// 公共前缀比所有字符串都短,随便选一个先,比如第一个元素
var prefix string = strs[0]
for _, str := range strs {
for strings.HasPrefix(str, prefix) == false {
if len(prefix) == 0 {
return ""
}
// 公共前缀不匹配就让它变短!(因为需要最长前缀,所以从后向前不断缩短被比较的prefix)
prefix = prefix[:len(prefix)-1]
}
}
return prefix
}