【每日一题】LeetCode - 最长公共前缀

【每日一题】LeetCode - 最长公共前缀

给定一个字符串数组 strs,寻找它们的最长公共前缀。如果不存在公共前缀,则返回空字符串 ""

示例

示例 1
输入: strs = ["flower","flow","flight"]
输出: "fl"

示例 2
输入: strs = ["dog","racecar","car"]
输出: ""
解释:字符串数组中没有共同前缀,因此返回空字符串。

限制条件

  • 数组长度 1 <= strs.length <= 200
  • 字符串长度 0 <= strs[i].length <= 200
  • 所有字符串均为小写英文字母

2. 解题思路与实现方法

方法 1:横向扫描法

将第一个字符串作为初始公共前缀,逐一与数组中的其他字符串对比,通过缩减前缀长度来保证公共性。最终得到的是所有字符串的最长公共前缀。

代码实现
#include<iostream>#include<vector>#include<string>#include<algorithm>usingnamespace std;classSolution{public: string longestCommonPrefix(vector<string>& strs){ string prefix = strs[0];// 初始前缀for(int i =1; i < strs.size();++i){int j =0;// 比较前缀与当前字符串的公共部分while(j < prefix.size()&& j < strs[i].size()&& prefix[j]== strs[i][j]){++j;} prefix = prefix.substr(0, j);// 更新前缀长度if(prefix.empty())break;// 若前缀为空,直接返回}return prefix;}};intmain(){ Solution s; vector<string> strs ={"flower","flow","flight"}; cout << s.longestCommonPrefix(strs)<< endl;return0;}
代码解析
  1. 初始设置:将 strs[0] 作为初始公共前缀 prefix
  2. 逐个比较:遍历剩余的字符串,每次更新 prefix 为其与当前字符串的公共前缀。
  3. 返回结果:当 prefix 缩减为 0 时,立即返回空字符串;否则返回最终公共前缀。
时间复杂度计算
  • 最坏情况:所有字符串长度相等且无公共前缀时,时间复杂度为 O(S),其中 S 是数组中所有字符的总和。
  • 平均情况:由于每次比较时前缀逐渐缩短,通常能达到 O(minLen * n) 的效率,minLen 为字符串中最小长度,n 为字符串个数。
空间复杂度

仅使用常数额外空间,空间复杂度为 O(1)


方法 2:动态规划

此问题可转化为动态规划问题,逐字符检查公共前缀的长度。

  1. 状态定义:定义 dp[i][j] 表示到第 i 个字符串和第 j 个字符时的最长公共前缀长度。
  2. 状态转移方程:如果 strs[i][j] == strs[i-1][j],则 dp[i][j] = dp[i-1][j] + 1,否则 dp[i][j] = 0
  3. 初始条件:第一个字符串为初始公共前缀,依次向后遍历更新。
代码实现
#include<iostream>#include<vector>#include<string>usingnamespace std;classSolution{public: string longestCommonPrefix(vector<string>& strs){if(strs.empty())return"";int n = strs.size();int minLen = INT_MAX;// 寻找最小字符串长度for(const string& s : strs){ minLen =min(minLen,(int)s.length());}int low =1, high = minLen;while(low <= high){int mid =(low + high)/2;if(isCommonPrefix(strs, mid)) low = mid +1;else high = mid -1;}return strs[0].substr(0,(low + high)/2);}private:boolisCommonPrefix(const vector<string>& strs,int len){ string prefix = strs[0].substr(0, len);for(int i =1; i < strs.size(); i++){if(strs[i].find(prefix)!=0){returnfalse;}}returntrue;}};intmain(){ Solution solution; vector<string> strs ={"flower","flow","flight"}; cout << solution.longestCommonPrefix(strs)<< endl;return0;}
代码解析
  1. 初始化:找到最短字符串的长度,设为 minLen
  2. 二分搜索:通过二分法逐步缩小范围,判断当前长度是否是公共前缀。
  3. 判断公共前缀:利用 isCommonPrefix 函数检查当前长度 len 是否为公共前缀。
  4. 返回结果:最终获得的 (low + high) / 2 即最长公共前缀长度。
时间复杂度分析
  • 二分查找的复杂度为 O(log minLen),每次查找调用 isCommonPrefix 的时间复杂度为 O(n * minLen)。因此总复杂度为 O(n * minLen * log minLen)
  • 空间复杂度为 O(1)

方法 3:纵向扫描法

逐列检查每个字符是否相同,遇到不同则停止。这种方法直观易懂,适用于小规模字符串数组。

代码实现
string longestCommonPrefix(vector<string>& strs){if(strs.empty())return"";for(int i =0; i < strs[0].size(); i++){char c = strs[0][i];for(int j =1; j < strs.size(); j++){if(i == strs[j].size()|| strs[j][i]!= c){return strs[0].substr(0, i);}}}return strs[0];}

3. 方法对比与总结

方法时间复杂度空间复杂度适用场景
横向扫描法O(S)O(1)字符串较多
二分法+动态规划O(n * minLen * log minLen)O(1)大规模字符串
纵向扫描法O(S)O(1)小规模字符串
  • 横向扫描法纵向扫描法都适合中小规模数据,横向法代码更简洁。
  • 二分法结合动态规划提升了效率,适用于需要更高效率的情况。

Read more

假网站排全网第二,真官网翻五页都找不到!NanoClaw创始人破防:SEO之战,我快要输了

假网站排全网第二,真官网翻五页都找不到!NanoClaw创始人破防:SEO之战,我快要输了

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 自从 OpenClaw 爆火之后,各种“Claw”项目接连出现,其中以安全优化版 NanoClaw 最为知名。它的核心代码仅有 4000 行,却获得了 AI 大牛 Andrej Karpathy 的点赞。 可谁也没想到,这款口碑极佳的开源项目,近来竟被一个仿冒网站抢了风头。 投诉无门之下,NanoClaw 创始人 Gavriel Cohen 在 X 社交平台上无奈发文怒斥:谷歌搜索错误地将假网站排在真官网前面,不仅破坏了项目声誉,还埋下了严重的安全隐患,而他费尽心力,却只能哀叹一句——“我正在为自己的开源项目打 SEO 战,但我快要输了。” 那么,NanoClaw 究竟发生了什么?又是怎么走红的?事情还要从 OpenClaw

By Ne0inhk
曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当年,微软一句“Windows 10 将是最后一个版本”的表态,让不少用户以为 Windows 进入了“只更新、不换代”的时代。但几年过去,现实却完全不同。 在 Windows 11 发布之后,如今关于 Windows 12 的传闻再次密集出现。从内部代号、代码片段,到硬件厂商的暗示与 OEM 预热标签,种种线索拼在一起,勾勒出一个明显的趋势——这不会只是一次常规升级,而更像是一次围绕 AI 的平台级重构。 更关键的是,这次争议,可能远比当年 TPM 2.0 更大。 精准卡位 Windows 10 退场的时间?

By Ne0inhk
Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

整理 | 屠敏 出品 | ZEEKLOG(ID:ZEEKLOGnews) 日前,TIOBE 发布了最新的 3 月编程语言榜单。整体来看,本月排名变化不算大,但榜单中仍然出现了一些值得关注的小波动。  AI 工具能帮大家秒懂最新编程语言趋势? 由于 2 月天数较少,3 月的榜单整体变化有限。借着这次发布,TIOBE CEO Paul Jansen 也回应了一个最近被频繁讨论的问题:为什么 TIOBE 指数仍然依赖搜索引擎统计结果?在大语言模型流行的今天,直接询问 AI 哪些编程语言最流行,是不是更简单? 对此,Jansen 的回答是否定的。 他解释称,TIOBE 指数本质上统计的是互联网上关于某种编程语言的网页数量。而大语言模型的训练数据同样来自这些网页内容,因此从信息来源来看,两者并没有本质区别。换句话说,LLM 的判断,本质上也是建立在这些网页数据之上的。 Python 活跃度仍在下降

By Ne0inhk
“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * “裸奔龙虾”已高达27万只!业内人士警告:一旦黑客入侵,敏感信息一秒搬空 * 阿里云 CTO 周靖人代管千问模型一号位,刘大一恒管理更多团队 * 中国传媒大学砍掉翻译、摄影等 16 个本科专业,直言教育要面向人机分工时代 * 雷军放话:小米将很快推出 L3、L4 的驾驶 * 消息称原理想汽车智驾一号位郎咸朋具身智能赛道创业 * vivo 前产品经理宋紫薇创业,瞄准 AI 时尚Agent,获亿元融资 * MiniMax 发布龙虾新技能,股价暴涨超 23% * 薪资谈判破裂,三星电子

By Ne0inhk