【每日算法 && 数据结构(C++)】—— 04 | 字符串数组的最长公共前缀(解题思路、流程图、代码片段)


在这里插入图片描述

A good beginning is half done.

好的开始是成功的一半

01 | 👑 题目描述

给你一个字符串数组,请求出这字符串的最长公共前缀

求字符串数组的最长公共前缀,就是要找到这个字符串数组中所有字符串的共同的、以相同字符开头的最长前缀子串。

举个例子,假设字符串数组为 {"flower", "flow", "flight"},我们需要找到这三个字符串的最长公共前缀。

在这个例子中,字符串数组的最长公共前缀是 “fl”,因为它是这三个字符串共同的、以相同字符开头的最长前缀子串。

换句话说,最长公共前缀是指在一个字符串数组中,从索引0开始的、每个字符串都拥有的最长的共同前缀子串。它可以帮助我们识别出字符串数组中的共同特征或相似性。

02 | 🔋 解题思路

具体的解题流程

  1. 首先,判断字符串数组是否为空或者长度为 0。如果是,直接返回空字符串作为最长公共前缀。

  2. 假设第一个字符串为参照字符串,将其作为初始的最长公共前缀。

  3. 遍历参照字符串的每个字符,依次与其他字符串相同位置上的字符进行比较。

  4. 如果在某个字符位置上存在不匹配的情况,或者已经达到了某个字符串的末尾,则停止比较。

  5. 更新最长公共前缀,只保留参照字符串中与当前位置相同的字符。

  6. 重复步骤 3-5,直到遍历完参照字符串的所有字符或者停止比较。

  7. 返回最终得到的最长公共前缀。

这种解题思路从第一个字符串开始逐个比较字符,通过不断缩小最长公共前缀的范围来找到所有字符串的最长公共前缀。注意,当字符串数组中有空字符串时,直接返回空字符串作为最长公共前缀。
在这里插入图片描述

  • 时间 && 空间复杂度
    • 时间复杂度O(n * m),其中n是字符串数组的长度,m是字符串的平均长度
      假设字符串数组的长度为n,其中每个字符串的平均长度为m。
      在最坏情况下,需要遍历字符串数组中的每个字符串,并逐个比较字符
    • 空间复杂度O(1)
      只使用了常数级别的额外空间来存储最长公共前缀和一些临时变量

03 | 🧢 代码片段

#include <iostream>
#include <vector>
using namespace std;

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;
}

int main() {
    vector<string> strs = {"flower", "flow", "flight"};
    string lcp = longestCommonPrefix(strs);
    cout << "Longest Common Prefix: " << lcp << endl;
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

各位大佬点点关注,点赞,收藏,有空的时候再回来看看,谢谢
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ltd Pikashu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值