【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;
    }
};
相关推荐
Niuguangshuo9 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶10 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
2401_8685347810 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
高亦真10 小时前
今天是学习嵌入式的第37天
linux·学习·算法
软件课代表CiCi10 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
蒸蒸yyyyzwd11 小时前
从面经中学到的三件事
c++·笔记
时时三省12 小时前
【时时三省】计算机c语言二级考试选择题重点
c++
罗西的思考12 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技13 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led