欢迎光临
我们一直在努力

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

LeetCode 14. 最长公共前缀

📌 题目描述

题目级别:简单

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

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

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

要找多个字符串的“公共前缀”,最符合人类直觉的方法就是纵向扫描。
我们把所有字符串上下对齐,然后从第 0 列开始,一列一列地往下看:

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

极客防越界细节:
为了防止在外层循环(列遍历)时,索引超过了某个较短字符串的长度而导致访问越界(Core Dump),我们在正式扫描前,先遍历一遍数组,找到所有字符串中的最短长度 mi。
这样外层循环最多只会执行 mi 次,从物理根源上彻底杜绝了越界崩溃的可能,代码运行极其稳健。


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

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;
}
};

赞(0)
未经允许不得转载:171主机测评 » 【Classic 150 刷题计划】 LeetCode 14. 最长公共前缀 | C++ 纵向扫描法与防越界细节
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址