【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节

LeetCode 14. 最长公共前缀

📌 题目描述

题目级别:简单

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

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

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

💡 破题思路:纵向扫描 (Vertical Scanning)

要找多个字符串的"公共前缀",最符合人类直觉的方法就是纵向扫描 。

我们把所有字符串上下对齐,然后从第 0 列开始,一列一列地往下看:

  • 如果这一列的所有字符都一样,那这个字符就是公共前缀的一部分,把它收进结果里。
  • 如果这一列出现了哪怕一个不一样的字符,或者某一个字符串已经提前见底了,说明公共前缀到此为止,立刻结束判定。

极客防越界细节:

为了防止在外层循环(列遍历)时,索引超过了某个较短字符串的长度而导致访问越界(Core Dump),我们在正式扫描前,先遍历一遍数组,找到所有字符串中的最短长度 mi 。

这样外层循环最多只会执行 mi 次,从物理根源上彻底杜绝了越界崩溃的可能,代码运行极其稳健。


💻 C++ 代码实现 (原汁原味作者版)

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string res = "";
        int m = strs.size();
        int l = 0;

        // 1. 防御性编程:提前算出最短的字符串长度 mi
        int mi = strs[0].size();
        for (int i = 0; i < m; i ++ )
            mi = min(mi, int(strs[i].size()));
        
        int flag = 0; // 熔断标记

        // 2. 外层循环:遍历每一列 (最多遍历到最短的那个字符串的末尾)
        for (int i = 0; i < mi; i ++ )
        {
            // 3. 内层循环:纵向比较每一个字符串的第 i 个字符
            for (int j = 0; j < m; j ++ )
            {
                // 以第 0 个字符串的字符为基准,只要发现有不相等的
                if (strs[j][i] != strs[0][i]) 
                {
                    flag = 1; // 触发熔断标记
                    break;    // 跳出内层循环
                }
            }
            
            // 如果触发了熔断,说明公共前缀断了,直接跳出外层循环
            if (flag) break;
            
            // 如果这一列全部通关,将其加入结果集
            res += strs[0][i];
        }

        return res;
    }
};
相关推荐
火2257 分钟前
# C++ 微服务即时通讯系统(三):网关设计——HTTP 请求、Session 鉴权与 WebSocket 通知上一篇
c++·http·微服务
Rain的Java大神之路39 分钟前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode
ZhengEnCi1 小时前
一亿条数据取前100条完全指南:从全量排序到分块流式最小堆的4种解法实测
python·算法·排序算法
C++ 老炮儿的技术栈1 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai10071 小时前
STL深度剖析2
java·c++·算法
幻智星科技1 小时前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
数智奔流1 小时前
MiniMax的低价攻势,撞上“背题”疑云
前端·javascript·算法
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛
广州智造1 小时前
Radioss中破坏模型FAILTAB1的详细介绍
数据库·人工智能·算法·机器学习·仿真软件·radioss
青少儿编程课堂1 小时前
2026蓝桥杯青少组图形化真题:校园飞机大战解析(全国青少年信息素养·电子学会图形化考级)
c++·python·算法·bfs·信息学竞赛