算法第二天之最长公共前缀

56 阅读1分钟

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

 

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""

解释:输入不存在公共前缀。  

提示:

1 <= strs.length <= 200

0 <= strs[i].length <= 200

strs[i] 仅由小写英文字母组成

第一种解法(自己写的):愚笨的暴力破解法

//当传入的数组只有一个数时,公共前缀就是他自己
if (strs.length == 1){
    return strs[0];
}
//当传入的数组的长度为0时,公共前缀为空
if (strs.length == 0){
    return "";
}
String result = "";
int i = 0;
//一直循环拿出数组中每个值的第一个字符,然后是第二个字符,然后依次比较
while (true) {
    //中间字符串cur,用来存储第一个数组第一个值的第i个字母
    String cur = "";
    for (String str : strs) {
        //防止substring截取字符超出范围限制
        if (i + 1 <= str.length() && cur.equals("")) {
            cur = str.substring(i, i + 1);
        //当第i个值互相比较不同的话返回result
        } else if (i + 1 > str.length() || !cur.equals(str.substring(i, i + 1))) {
            return result;
        }
    }
    result += cur;
    i++;
}

第二种解法:参考leetcode上大佬的解法

//同样,当传入的数组长度为0时公共前缀一定是空
if (strs.length == 0){
    return "";
}
else{
    //存入数组第一个值
    String common_prefix = strs[0];
    for (String str: strs){
        //遍历数组的所有值,遍历出的值实现indexOf方法判断是否包含common_prefix,如果包含
        //且在该遍历出的值的第一位上,则公共前缀不变,如果包含,则从末尾一位一位的删除
        //common_prefix的值直到可以包含,如果删到空都不包含,则公共前缀是空的
        while (str.indexOf(common_prefix) != 0) {
            common_prefix = common_prefix.substring(0, common_prefix.length() - 1);
            if (common_prefix.isEmpty())
                return "";
        }
    }
    return common_prefix;
}