14. 最长公共前缀 - 力扣(LeetCode)

文章讲述了如何在Java和Python中编写函数,找出给定字符串数组的最长公共前缀。通过边界情况处理、遍历字符串并比较字符,确保找到所有字符串的最短公共前缀。
摘要由CSDN通过智能技术生成

基础知识要求:

Java:方法、数组、逻辑运算符、for循环、if判断、字符串

Python: 方法、列表、逻辑运算符、for else语句、if判断、字符串

题目: 

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

思路解析:

  1. 边界情况处理
    • 如果字符串数组 strs 为空,直接返回空字符串 ""
    • 如果字符串数组 strs 只有一个字符串,直接返回这个字符串。
  2. 初始化公共前缀
    • 假设第一个字符串 strs[0] 是最长公共前缀的初始值。
  3. 比较每个字符串
    • 从第二个字符串开始,遍历 strs 中的每个字符串。
    • 对于每个字符串,都将其与当前的公共前缀进行比较。
    • 如果发现当前字符串的某个位置的字符与公共前缀的对应字符不匹配,或者当前字符串的长度已经小于公共前缀的长度,就更新公共前缀为该位置之前的所有字符(如果之前还有字符的话)。
  4. 更新逻辑
    • 在比较过程中,如果发现某个字符串比公共前缀短,或者某个位置的字符不匹配,就截断公共前缀到这个位置之前(包含当前位置)。
    • 注意,每次更新公共前缀时,都是基于当前已经遍历过的字符串。
  5. 返回结果
    • 当遍历完所有字符串后,得到的公共前缀就是最长公共前缀。
    • 返回这个最长公共前缀。

Java代码示例:

public class LongestCommonPrefix {  
  
    /**  
     * 找到字符串数组中的最长公共前缀  
     *  
     * @param strs 字符串数组  
     * @return 最长公共前缀,如果数组为空或所有字符串均为空,则返回空字符串  
     */  
    public static String longestCommonPrefix(String[] strs) {  
        if (strs == null || strs.length == 0) {  
            // 如果数组为空,则返回空字符串  
            return "";  
        }  
  
        // 假设第一个字符串为最长公共前缀的初始值  
        String prefix = strs[0];  
  
        // 从第二个字符串开始遍历  
        for (int i = 1; i < strs.length; i++) {  
            // 如果当前字符串为空,则最长公共前缀为空  
            if (strs[i].isEmpty()) {  
                // 返回空字符串作为结果  
                return "";  
            }  
  
            // 比较当前字符串与prefix  
            int j;  
            for (j = 0; j < Math.min(prefix.length(), strs[i].length()); j++) {  
                // 如果发现字符不匹配,截断prefix  
                if (prefix.charAt(j) != strs[i].charAt(j)) {  
                    break;  
                }  
            }  
  
            // 更新prefix为已匹配的字符部分  
            prefix = prefix.substring(0, j);  
  
            // 如果prefix为空,则最长公共前缀为空,无需继续比较  
            if (prefix.isEmpty()) {  
                break;  
            }  
        }  
  
        // 返回最终得到的最长公共前缀  
        return prefix;  
    }  
  
    public static void main(String[] args) {  
        String[] strs1 = {"flower", "flow", "flight"};  
        System.out.println(longestCommonPrefix(strs1)); // 输出:"fl"  
  
        String[] strs2 = {"dog", "racecar", "car"};  
        System.out.println(longestCommonPrefix(strs2)); // 输出:""  
    }  
}

在上面的代码中,我们首先处理了边界情况,包括空数组和空字符串。然后,我们初始化prefix为数组中的第一个字符串,并从第二个字符串开始遍历数组。对于每个字符串,我们都将其与当前的prefix进行比较,并在遇到不匹配的字符时截断prefix。最后,我们返回得到的prefix作为最长公共前缀。如果prefix在遍历过程中变为空字符串,则说明不存在公共前缀,直接返回空字符串。

Python代码示例:

def longestCommonPrefix(strs):  
    if not strs:  # 如果字符串数组为空,返回空字符串  
        return ""  
  
    # 获取第一个字符串作为最长公共前缀的初始候选  
    prefix = strs[0]  
  
    # 遍历字符串数组中的每个字符串  
    for i in range(1, len(strs)):  
        # 如果当前字符串为空,则最长公共前缀必定为空  
        if not strs[i]:  
            return ""  
  
        # 逐个比较当前候选前缀和当前字符串的字符  
        # 使用min函数确保我们不会超出较短字符串的长度  
        for j in range(min(len(prefix), len(strs[i]))):  
            if prefix[j] != strs[i][j]:  
                # 如果字符不匹配,则截断当前候选前缀  
                prefix = prefix[:j]  
                break  
        else:  
            # 如果循环正常结束(没有通过break跳出),说明已经比较完了较短的字符串  
            # 这时我们需要检查是否还需要继续比较更长的部分  
            if j < len(prefix) - 1:  
                # 如果还有未比较的部分,则截断当前候选前缀  
                prefix = prefix[:j + 1]  
  
    return prefix  
  
# 示例测试  
print(longestCommonPrefix(["flower", "flow", "flight"]))  # 输出:"fl"  
print(longestCommonPrefix(["dog", "racecar", "car"]))     # 输出:""

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千小凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值