开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
力扣14. 最长公共前缀
一、题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
我的思路比较简单,每次遍历字符串,或者将每个字符串放入一个rune切片,然后每次取一个序号,直到最短的字符串或切片长度。
然后如果相等就记录,然后达到下一个序号,如果不等就停止,然后返回字符串。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是一次通过的,刚开始代码是下面这样写的:
func longestCommonPrefix(strs []string) string { min := 200 + 1 for _,s := range strs{ length := len(s) if length < min { min = length } } max := "" for i:=0;i<min;i++{ flag := strs[0][i] for _,s := range strs{ if s[i] == flag{ max += string(s[i]) } else{ return max } } } return max }这样会导致每次比对都在要返回的字符串中连接一个字符:
输入 ["flower","flow","flight"] 输出 "fffllloo" 预期结果 "fl"看到这个结果,我一想,当出现strs长度个字符是不是就可以添加了,而少于这个长度我们就不添加即可。果然最后通过了!
执行结果:
通过
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了21.80%的用户
通过测试用例:124 / 124
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
工作中这种函数就怕来一个nil或[]string{}给你搞出一个死循环来。 这里,我们按题设知道不用做“排错”,所以,第一行的strs[0]如果越界panic相当于一个自排错,好过死循环。
func longestCommonPrefix(strs []string) string { base := strs[0] //1)panic自排错不会死循环 for i:=0; i<len(base); i++ { for _, str := range strs[1:] { if i >= len(str) || str[i] != base[i] { return base[:i] } } } return base } 作者:pandaoknight 链接:https://leetcode.cn/problems/longest-common-prefix/solution/by-pandaoknight-wmix/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
func longestCommonPrefix(strs []string) string {
min := 200 + 1
for _,s := range strs{
length := len(s)
if length < min {
min = length
}
}
max := ""
for i:=0;i<min;i++{
flag := strs[0][i]
num := 0
for _,s := range strs{
if s[i] == flag{
num+=1
if num == len(strs){
max += string(s[i])
}
} else{
return max
}
}
}
return max
}
四、总结:
这道题目比较简单,关键是思路问题,我的解法看来还不错!哈哈哈,但是字符串合并貌似是建立一个新字符串,导致空间复杂度有点大!
模板来源
作者:掘金酱
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。