Loading

最长公共前缀

1.问题描述

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

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

示例 1:

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

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:所有输入只包含小写字母 a-z 。

2.求解

常规解法

取出第一个字符串,依次遍历整个数组,与第一个字符串比较。

代码如下
public String longestCommonPrefix(String[] strs) {
    if(strs.length == 0){
        return "";
    }
    String s = strs[0];
    for (int i = 1; i < strs.length; i++) {
        int index = getStr(s, strs[i]);
        if (index == 0) {
            return "";
        }
        s = s.substring(0, index);
    }
    return s;
}

public int getStr(String str1, String str2) {
    int index = 0, m = str1.length(), n = str2.length();
    if (m > n) {
        m = str2.length();
    }
    for (int i = 0; i < m; i++) {
        if (str1.charAt(index) == str2.charAt(index)) {
            index++;
        } else {
            break;
        }
    }
    return index;
}
  • 时间复杂度 O(mn),其中 m是字符串数组中的字符串的平均长度,n 是字符串的数组的长度。
  • 空间复杂度 O(1)

解法二

    /*
    执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
    内存消耗:36.5 MB, 在所有 Java 提交中击败了79.44% 的用户
    */
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){
            return "";
        }
        String str = strs[0];
        for(int i = 1; i < strs.length; i++){
            if(str.length() == 0){
                return "";
            }
            while(!strs[i].startsWith(str)){
                str = str.substring(0, str.length() - 1);
            }
        }
        return str;
    }
posted @ 2020-09-20 16:46  水纸杯  阅读(86)  评论(0)    收藏  举报