leetcode14,最长公共子串

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]
}

优化后的代码,行数减少了,更好调了,性能也更好

在循环中,验证条件,不符合条件就退出,这是一个技巧

你开始觉得边界条件很多,其实也没有什么,关键是自己会

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值