leetcode14:最长公共子串:
笨拙的原始解法,编程中遇到太多的bug,觉得有很多边界问题
func longestCommonPrefix(strs []string) string {
if len(strs) <1 {
return ""
}
rune_strs :=make([][]rune,len(strs))
// 初始化一个值
for i:=0;i<len(strs);i++{
if len(strs[i])==0{
return ""
}
// if min > len(rune_strs[i]){
// min=len(rune_strs[i])
// }
rune_strs[i]= []rune(strs[i])
}
min:= len(rune_strs[0])
for i:=0;i<len(rune_strs);i++{
if min > len(rune_strs[i]){
min =len(rune_strs[i])
}
}
i:=0
fmt.Println(min)
byw:
for ;i<min;i++{
for j:=0;j<len(rune_strs);j++{
fmt.Println(j)
if j-1 >=0 && rune_strs[j-1][i] != rune_strs[j][i]{
break byw
}
}
}
fmt.Println(i)
// 保证逻辑正确
return string(rune_strs[0][0:i])
}
认清问题本质,先考虑核心步骤,再考虑边界问题。也即先把主体写出来,再完善边界。
func longestCommonPrefix(strs []string) string{
if len(strs) <1 {
return ""
}
// ascii字符,不用转换为rune
// for 二层循环,外层i
i:=0
for ;i<len(strs[0]);i++{
for j:=0;j<len(strs);j++{
// 不符合条件即退出
if i>=len(strs[j]){
return strs[0][0:i]
}
if j-1>=0 && strs[j-1][i] !=strs[j][i] {
return strs[0][0:i]
}
}
}
return strs[0][0:i]
}
优化后的代码,行数减少了,更好调了,性能也更好
在循环中,验证条件,不符合条件就退出,这是一个技巧
你开始觉得边界条件很多,其实也没有什么,关键是自己会