(每日一题) 力扣 14 最长公共前缀

14. 最长公共前缀题解:多方法详解与C++实现

问题描述

给定字符串数组,找出所有字符串的最长公共前缀。若不存在则返回空字符串。

示例

复制代码
输入:["flower","flow","flight"]
输出:"fl"

方法一:纵向扫描(逐字符比较)

算法思想

逐个字符比较所有字符串的同一列,直到出现不匹配字符为止。

复杂度分析

  • 时间复杂度:O(m*n)
    (m=最短字符串长度,n=字符串数量)
  • 空间复杂度:O(1)

C++实现

cpp 复制代码
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.empty()) return "";
        
        int min_len = INT_MAX;
        for(auto& s : strs) 
            min_len = min(min_len, (int)s.size());
        
        for(int j=0; j<min_len; ++j) {
            char c = strs[0][j];
            for(int i=1; i<strs.size(); ++i) {
                if(strs[i][j] != c)
                    return strs[0].substr(0,j);
            }
        }
        return strs[0].substr(0,min_len);
    }
};

方法二:横向扫描(迭代比较)

算法流程

  1. 取第一个字符串为初始前缀
  2. 依次与后续字符串比较,逐步缩短前缀

初始前缀:flower 与flow比较得flo 与flight比较得fl 最终结果fl

代码实现

cpp 复制代码
string longestCommonPrefix(vector<string>& strs) {
    if(strs.empty()) return "";
    string prefix = strs[0];
    for(int i=1; i<strs.size(); ++i){
        while(strs[i].find(prefix) != 0){
            prefix = prefix.substr(0, prefix.length()-1);
            if(prefix.empty()) return "";
        }
    }
    return prefix;
}

相关推荐
颜酱36 分钟前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway7 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风7 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect7 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea21 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉