力扣第10刷-最长公共前缀

简介: 力扣第10刷-最长公共前缀

Example

最长公共前缀

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

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

示例 1:

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

输出:"fl"

示例 2:

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

输出:""

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

解题思路:用表示字符串表示字符串的最长公共前缀。

可以得到以下结论:

 

基于该结论,可以得到一种查找字符串数组中的最长公共前缀的简单方法。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。

其主要思想如下图所示。

绘图1.jpg

解题步骤:

1. 首先判断给定的字符串数组是否为null或长度是否为0,若是则公共前缀一定为””,将””返回。

2. 基于解题思路,第一步将S1与S2进行比较,求公共前缀prefix,而后将prefix依次与后续字符串比较。因此首先将S1作为默认公共前缀,这样整个操作流程变为将公共前缀prefix(默认为S1)依次与S2开始的字符串相比较,生成新的公共前缀prefix,进行下一轮比较。每次比较结束后,若新的公共前缀prefix长度为0,说明不存在公共前缀,即公共前缀为””,则退出循环,将此prefix返回。否则说明比较到当前仍存在公共前缀prefix,继续遍历。

3. 遍历结束后,将公共前缀prefix返回。

4. 解题中用到的两个字符串比较,求公共前缀的方法如下:①求两个字符串长度的最小值length,作为遍历每个字符串中字符的最大个数。②定义变量index,作为截取子串的索引位置,初始值为0。③定义循环,从初始0索引开始遍历,若当前索引位置小于length且两个字符串的当前索引位置的字符相等,则将变量index自加一,继续考察下一个索引位置,否则说明索引超出长度最小的字符串的区间,考察完毕,或者取出的两个字符不相等,跳出循环。④将str1(或str2)的0索引至index索引之间的子串(左闭右开)截取出来,即为两个字符串的最大公共前缀,将其返回。

 

示例代码如下:

public class LongestCommonPrefix {
    /**
     * 编写一个函数来查找字符串数组中的最长公共前缀。
     * 如果不存在公共前缀,返回空字符串 ""。
     * 示例 1:
     * 输入:strs = ["flower","flow","flight"]
     * 输出:"fl"
     * 示例 2:
     * 输入:strs = ["dog","racecar","car"]
     * 输出:""
     * 解释:输入不存在公共前缀。
     */
    public static void main(String[] args) {
        LongestCommonPrefix lcp = new LongestCommonPrefix();
        System.out.println(lcp.longestCommonPrefix(new String[]{"flower", "flow", "flight"})); // fl
    }
    /**
     * 官方
     *
     * @param strs
     * @return
     */
    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);
    }
}
相关文章
|
6月前
|
机器学习/深度学习 Java
LeetCode 14. 最长公共前缀
LeetCode 14. 最长公共前缀
59 1
|
6月前
|
Python
leetcode-14:最长公共前缀
leetcode-14:最长公共前缀
44 0
【Leetcode-13.罗马数字转整数 -14.最长公共前缀】
【Leetcode-13.罗马数字转整数 -14.最长公共前缀】
52 0
|
1月前
|
算法
Leetcode第十四题(最长公共前缀)
这篇文章介绍了一种算法,用于在给定的字符串数组中找到最长公共前缀,通过逐字符比较每个字符串的对应位置,一旦发现不匹配立即返回当前已匹配的子串作为公共前缀。
24 0
|
3月前
|
算法
LeetCode第14题最长公共前缀
该文章介绍了 LeetCode 第 14 题最长公共前缀的解法,通过取一个字符串作为基准,一列一列字符比较来找出最长公共前缀,时间复杂度为 O(m * n),同时提到也可使用二分查找法,但代码复杂度会上升。
LeetCode第14题最长公共前缀
|
5月前
|
存储 算法 Java
【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明,Easy)
42 1
|
5月前
|
算法
力扣经典150题第二十题:最长公共前缀
力扣经典150题第二十题:最长公共前缀
29 0
|
6月前
【力扣】14. 最长公共前缀
【力扣】14. 最长公共前缀
|
6月前
|
C++ 索引
【力扣经典面试题】14. 最长公共前缀
【力扣经典面试题】14. 最长公共前缀
|
6月前
|
算法 Java
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
45 0