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; // 返回最长公共前缀
    }
};
相关推荐
Mai Dang1 小时前
黑马Linux学习笔记
linux·笔记·学习·阿里云
学困昇1 小时前
Linux基础开发工具(上):从包管理到“进度条”项目实战,掌握 yum/vim/gcc 核心工具
linux·运维·开发语言·数据结构·c++·vim
Yan-英杰1 小时前
openEuler 25.09 VM虚拟机实测:性能与安全双维度测评
服务器·开发语言·科技·ai·大模型
beijingliushao1 小时前
99-在Linux上安装Anaconda
linux·运维·服务器·spark
wanhengidc1 小时前
弹性云服务器的安全保障都有哪些?
运维·服务器·科技·安全·智能手机
乌鸦9441 小时前
进程(2)
linux
yenggd1 小时前
samba服务配置原理
服务器·开发语言·php
倔强的石头1061 小时前
openEuler 开发环境搭建与工具链优化实践深度评测
运维·服务器·操作系统·openeuler
翼龙云_cloud1 小时前
亚马逊云渠道商:如何3 步实现 AWS RDS 读写分离?
运维·服务器·云计算·php·aws