算法小知识----11.05----最长公共前缀

79 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

最长公共前缀

该题出自力扣的14题——最长公共前缀(简单题),题解消化于评论

审题

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

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

  • 总的来说就是,给一个字符串数组,找出里面字符串的最长公共前缀

  • 官方题解有4种方法,横向、纵向、分治、二分

  • 最初的想法是,找出数组内的最短字符串(因为最长的公共前缀长度也不过是最短字符串的长度)

    • 遍历数组,与每个字符串对比,并计算长度
    • 随后便推翻了这个想法,因为找出最短字符串,其实意义不大;因为只要随便找一个数组内的字符串作为标识即可,超出长度即代表后续必然为空
  • 最终解决:

    • 校验判空
    • 遍历数组,只记录最长公共前缀的长度,取数组内首位字符串作为标识,遍历其他作为对比
    • 最终用 String . substring 方法去输出;需要注意的是循环内的字段+1或-1;以及最终输出的+1
    • 整个思路就是:
      • 使用第一个字符串与其他字符串进行逐一对比得出前缀长度;并且所有长度取最小值就是题解
    • 相对优化:
      • 不用每次都比较整个字符串,只要比较当前的前缀长度即可(因为公共前缀必然越来越小)
      • 如果没有公共前缀,那么不需要遍历剩余的字符串
      • 相对节省了对整个字符的遍历+存储

编码

    public static String longestCommonPrefix(String[] strs) {
        if (StringUtils.isEmpty(strs)){
            return "";
        }
        //获取最长公共的前缀
        int end = strs[0].length()-1;
        for (int i =0;i<strs.length;i++){
            //循环字符串
            int j =0;
            for (;j<=end &&strs[i].length()>j ;j++){
                if (strs[0].charAt(j) != strs[i].charAt(j)){
                    break;
                }
            }
            end = Math.min(end,j-1);
            if (end<0){
                break;
            }
        }
        return strs[0].substring(0,end+1);
    }
  • 当前实现方法的时间复杂度是O(m*n),双重for循环
  • 空间复杂度是O(1),都是常量

1635906773(1).jpg