(每日一题) 力扣 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;
}

相关推荐
GreenTea1 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
fqq32 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
Thecozzy4 小时前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
半夏微凉半夏殇4 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_906565124 小时前
数学之美探究
算法
oier_Asad.Chen4 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
Dr.kangder5 小时前
嵌入式面试总结(十五)——异常处理
单片机·面试·职场和发展·系统架构·嵌入式
leisoo80976 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_17688 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
郝学胜-神的一滴9 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程