leetCode第14题——最长公共前缀

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetCode第14题——最长公共前缀相关的知识,希望对你有一定的参考价值。

一、题目

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”

示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:""
解释:输入不存在公共前缀。

二、思路及图解 (横向比较的方式实现)

1、思路

  • 将字符串水平排列,第 0 个字符串flower和第 1 个字符串flower找最长子串,结果为 flower,
  • 再把结果和第 2 个字符串flow比较,结果为 flow,
  • 再把结果和第 3 个字符串flight比较,结果为 fl,即为最终结果。

2、图解

三、题目代码解析(横向比较的方式实现)

1、代码

public class Test {
    public static void main(String[] args) {
        String[] strs={"flower","flow","flight"};
        //横向比较的方式实现
        String str=longestCommonPrefix(strs);
        System.out.println("最长公共前缀为【"+str+"】");
    }
     /**
     * 横向比较的方式实现
     */
    public static String longestCommonPrefix(String[] strs){
        if(strs==null || strs.length==0){
            return "";
        }
        //初始化前缀为数组下标为0的位置字符串,即flower
        String prefix = strs[0];
        //依次遍历字符串数组中的每个字符串
        for(int i=0;i<strs.length;i++){
            /**
             * 第1次遍历把初始化的前缀flower和遍历的第1个字符串flower比较
             * 第2次遍历把第1次遍历的公共前缀结果flower和第2个字符串flow比较
             * 第3次遍历把第2次遍历的公共前缀结果flow和第3个字符串flight比较
             * 返回第3次遍历的公共前缀结果fl
             */
            prefix = longCommonPrefix(prefix,strs[i]);
            if (prefix.length() == 0) {
                break;
            }
        }
        return prefix;
    }

    public static String longCommonPrefix(String str1,String str2){
        //获取2个字符串的最小长度
        int length = Math.min(str1.length(), str2.length());
        //初始值的长度为0
        int index = 0;
        //如果初始值的长度 小于 字符串最小长度
        //并且 字符串str1中的每一个字符和字符串str2中的每一个字符相等,
        //则长度每次+1
        while (index < length && str1.charAt(index) == str2.charAt(index)) {
            index++;
        }
        //截取字符串中从0到最大的长度的字符串并返回
        return str1.substring(0, index);
    }
}

2、结果如下图:

3、复杂度分析

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

四、思路及图解 (纵向比较的方式实现)

1、思路

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

2、图解

五、题目代码解析(纵向比较的方式实现)

1、代码

public class Test {
    public static void main(String[] args) {
        String[] strs={"flower","flow","flight"};
        //纵向比较的方式实现
        String str=longestCommonPrefixs(strs);
        System.out.println("最长公共前缀为【"+str+"】");
    }
     /**
     * 纵向比较的方式实现
     */
    public static String longestCommonPrefixs(String[] strs){
        if(strs == null || strs.length==0){
            return "";
        }
        //遍历所有列
        for (int i = 0; i < strs[0].length(); i++) {
            //保存 i 列第 0 行的字符便于后续比较
            char c = strs[0].charAt(i);
            //比较第 1,2,3... 行的字符和第 0 行是否相等
            for (int j = 1; j < strs.length; j++) {
                /**
                 * i == strs[j].length() 表明当前行已经到达末尾
                 * strs[j].charAt(i) != c  当前行和第 0 行字符不相等
                 */
                if (i == strs[j].length() || strs[j].charAt(i) != c) {
                    return strs[0].substring(0, i);
                }
            }
        }
        return strs[0];
    }
}

2、结果如下图:

3、复杂度分析

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

以上是关于leetCode第14题——最长公共前缀的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。

Leetcode练习(Python):字符串类:第14题:最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。

LeetCode第19天 - 14. 最长公共前缀

python(leetcode)-14最长公共前缀

LeetCode第[14]题(Java): Longest Common Prefix

Leetcode 14 最长公共前缀