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

相关推荐
W23035765736 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
minji...7 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
语戚8 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_118 小时前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
bIo7lyA8v9 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo9 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945199 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头9 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
ASKED_20199 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法