LeetCode - 14. Longest Common Prefix

这道题目的解法非常值得借鉴,一开始的思路是先用str[0]开始,逐个增加pre,并且分别检查其他的string是否含有pre作为开头。但是这道题目是首先把pre设置为str[0],并且依次向后检测其他的string是否含有这个pre作为开头,如果没有的话那么就使用String的substring method将pre的长度减一,然后再进行检测。最差的情况下时间复杂度为O(S),其中S为所有string的长度的和,最差的情况在所有的字符串都相等的时候达到,空间复杂度为O(1),代码如下:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs == null || strs.length == 0) return "";       // corner case
        
        String pre = strs[0];
        for(int i = 1; i < strs.length; i++){
            // Reduce pre until have sth in common
            while(strs[i].indexOf(pre) != 0){
                pre = pre.substring(0, pre.length() - 1);
                if(pre.isEmpty()) return "";
            }
        }
        
        return pre;
    }
}

这道题目在LeetCode的article版有非常全面的解释,链接在此:https://leetcode.com/articles/longest-common-prefix/#approach-1-horizontal-scanning

知识点:

1. 注意这里判断某个string是否为另一个string的prefix的方法是s.indexOf(pre) == 0,而不是s.indexOf(pre) != -1,后者是判断pre是否在string中的方法

2. String的一些常用的method要记下: isEmpty(), length(), indexOf(), substring(), 注意substring使用两个参数的时候不包括后面的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值