Go&Java之最长公共前缀

55 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

最长公共前缀

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

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

 

  • 示例 1:

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

输出:"fl"

  • 示例 2:

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

输出:""

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

提示:

1 <= strs.length <= 200

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

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

方法一:横向扫描(Java)

当字符串数组长度为 0 时则公共前缀为空,直接返回

令最长公共前缀 ans 的值为第一个字符串,进行初始化

遍历后面的字符串,依次将其与 ans 进行比较,两两找出公共前缀, 最终结果即为最长公共前缀

如果查找过程中出现了 ans 为空的情况,则公共前缀不存在直接返回

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        String prefix = strs[0];
        int count = strs.length;
        for (int i = 1; i < count; i++) {
            prefix = longestCommonPrefix(prefix, strs[i]);
            if (prefix.length() == 0) {
                break;
            }
        }
        return prefix;
    }

    public String longestCommonPrefix(String str1, String str2) {
        int length = Math.min(str1.length(), str2.length());
        int index = 0;
        while (index < length && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        return str1.substring(0, index);
    }
}

时间复杂度:O(m*n)

空间复杂度:O(1)

方法二:纵向扫描(Go)

另一种方法是纵向扫描。

纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。

func longestCommonPrefix(strs []string) string {
    if len(strs) == 0 {
        return ""
    }
    for i := 0; i < len(strs[0]); i++ {
        for j := 1; j < len(strs); j++ {
            if i == len(strs[j]) || strs[j][i] != strs[0][i] {
                return strs[0][:i]
            }
        }
    }
    return strs[0]
}

时间复杂度:O(m*n)

空间复杂度:O(1)