14. 最长公共前缀-leetcode

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

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

示例 2:

复制代码
输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成
cpp 复制代码
#include <vector>
#include <string>
using namespace std;

class Solution {
public:
    /**
     * @brief 查找字符串数组中所有字符串的最长公共前缀
     * @param strs 输入的字符串数组,存储待查找公共前缀的所有字符串
     * @return string 所有字符串的最长公共前缀;若不存在公共前缀或数组为空,返回空字符串
     */
    string longestCommonPrefix(vector<string>& strs) {
        int index = 0;          // 公共前缀的起始索引(固定为0,从字符串开头开始匹配)
        int rindex = 0;         // 记录当前匹配成功的公共前缀长度(即已匹配的字符个数)
        int n = strs.size();    // 字符串数组的长度(待匹配字符串的个数)

        // 边界处理1:若输入数组为空,直接返回空字符串(无字符串可匹配)
        if (n == 0) return "";

        int len = strs[0].size(); // 以数组第一个字符串为基准,获取其长度(作为匹配的最大边界)
        string str = strs[0];     // 取出第一个字符串作为基准字符串,后续所有字符串与它对比

        // 外层循环:遍历基准字符串的每个字符(从第0位开始)
        for (int i = 0; i < len; i++) {
            char a = str[i]; // 当前基准字符串的第i位字符(待匹配的目标字符)
            int flag = 0;    // 匹配标记:0表示当前字符匹配成功,1表示匹配失败

            // 内层循环:将基准字符与数组中其他所有字符串的第i位字符对比
            for (int j = 0; j < n; j++) {
                // 若当前字符串的第i位字符不存在(长度不足)或与基准字符不相等,标记匹配失败
                if (a != strs[j][i]) {
                    flag = 1;
                    break; // 无需继续对比其他字符串,直接退出内层循环
                }
            }

            // 若当前字符在所有字符串中均匹配成功,更新公共前缀长度
            if (!flag) {
                rindex++;
            } else {
                break; // 若匹配失败,后续字符无需再检查,退出外层循环
            }
        }

        // 边界处理2:若rindex仍为0,说明无任何公共前缀(仅匹配了0个字符),返回空字符串
        if (index == rindex) return "";

        // 截取公共前缀:从index(0)开始,长度为rindex(匹配成功的字符个数)
        string ans = str.substr(index, rindex);
        return ans; // 返回最长公共前缀
    }
};
相关推荐
木井巳3 分钟前
【BFS 解决拓扑排序】火星词典
java·算法·leetcode·广度优先·宽度优先·图搜索算法
Allstar_434 分钟前
拆解全星APQP系统的六大核心质量工具如何联动——汽车供应链企业专业级研发项目管理系统
运维·服务器
随便写个软件8 分钟前
【新版本】EasyExplorer资源管理器 3.12.0——地址栏重要更新
运维·服务器·前端·everything·资源管理器
2402_8828938614 分钟前
Linux 进程概念详解(下)—— 进程调度、环境变量与虚拟地址空间
linux·进程·虚拟地址空间
虚无的纽扣16 分钟前
【Linux】揭开文件系统神秘的面纱:第四讲:可执行文件的组装车间
linux·运维·服务器
YMWM_18 分钟前
ubuntu系统字体缩放配置
linux·运维·ubuntu
hiahiahia12319 分钟前
Agent Tool 执行失败怎么办
服务器·前端
Amelio_Ming23 分钟前
rk3588 pcie驱动分析之二 (pcie设备树节点分析)
linux·嵌入式硬件
zbyyd41 分钟前
Linux字符设备驱动:LED驱动实战开发
linux·单片机·arm·驱动
曦夜日长44 分钟前
Git系统篇,Git远程仓库(三):本地仓库与远程仓库的交互
linux·服务器·网络·git·交互