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; // 返回最长公共前缀
    }
};
相关推荐
M78佐菲7 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx7 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
圣保罗的大教堂8 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
不怕犯错,就怕不做8 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
weixin_416667969 小时前
【无标题】
运维·服务器·网络
一池秋_9 小时前
arm低配linux设备,桌面应用冷启动提速方法
linux·运维·arm开发
惜离殇9 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
上海云盾-小余11 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
闲云野鹤在人间12 小时前
OpenStack架构介绍和安装流程
linux·网络·架构·openstack
我命由我1234512 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime