4.<tag-字符串和常规>-lt- 14. 最长公共前缀

lt- 14. 最长公共前缀

[案例需求]
在这里插入图片描述

[思路分析一, 横向比较法]

  • 遍历字符数组, 两两进行比较, 记录当前比较出的公共前缀值, 就这样比较下去, 找出所有的字符都含有的公共前缀(不断的更新前缀, 为了使所有的字符都含有该前缀, 肯定是去最小值了);

在这里插入图片描述
[代码实现]

//暴力匹配, 

class Solution {
   
    public String longestCommonPrefix(String[] strs) {
       
       
       if(strs == null || strs.length < 1) return "";

       if(strs.length == 1)return strs[0]; // 单个字符

       int prefix = Integer.MAX_VALUE;
       //不断的两两比较,更新较大的前缀
       for(int i = 1; i < strs.length; i++){
            String str1 = strs[i - 1];
            String str2 = strs[i];

            //Q: 如何比较两个字符串?
            //charAt(i)逐一比对
            int minLength = Math.min(str1.length(), str2.length());
            int index = 0;
            while(index < minLength && str1.charAt(index) == str2.charAt(index)){
                ++index;
           }
           prefix = Math.min(prefix, index);  
           if(prefix == 0)break;  
        }
        
        return strs[0].substring(0, prefix);
    }   

    
}

官方解法

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(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次。
  • 空间复杂度:O(1)。使用的额外空间复杂度为常数。

[思路分析二, 纵向比较法]

参见

posted @ 2022-05-26 20:29  青松城  阅读(20)  评论(0)    收藏  举报