【LeetCode-字符串】最长公共前缀

题目描述#

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例

Copy
输入: ["flower","flow","flight"] 输出: "fl" 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。

题目链接: https://leetcode-cn.com/problems/longest-common-prefix/

思路1#

首先找到最短的字符串,然后遍历最短的字符串,将当前位和其余字符串作比较:如果其余字符串的当前位和最短字符串的当前位全部相等,则比较下一位;如果有一个不相等,则循环终止,从字符串开始位置到当前位置的前一位就是最长的公共前缀(其实不需要根据最短字符串进行比较,随便找一个字符串作为基准比较就行了)。代码如下:

Copy
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.empty()) return ""; int shortest = 0x7fffffff; string shortestStr = ""; for(int i=0; i<strs.size(); i++){ if(strs[i].length()<shortest){ shortest = strs[i].length(); shortestStr = strs[i]; } } int i=0; while(i<shortest){ bool breakFlag = false; for(int j=0; j<strs.size(); j++){ if(strs[j][i]!=shortestStr[i]){ breakFlag = true; break; } } if(breakFlag) break; i++; } return shortestStr.substr(0,i); } };
  • 时间复杂度:O(n)
    n是字符串数组的长度。最坏情况下为O(n*m),其中m是最短字符串的长度。
  • 空间复杂度:O(1)

思路2#

首先选择一个字符串当做目前的前缀,不妨选第一个,然后判断目前的前缀是否是第二个字符串的前缀:如果不是,则将当前的前缀最后一个字符去掉,如果去掉后当前前缀为空,则直接返回;如果去掉后不为空且是第二个字符串的前缀;那么继续通过同样的方法比较第三个字符串,直至比较一遍或者前缀为空,如果比较结束后,当前前缀不为空,则当前前缀就是最长的公共前缀。代码如下:

Copy
class Solution { public: 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不是strs[i]的前缀 prefix.pop_back(); // 删除prefix的最后一个字符 if(prefix.empty()) return prefix; } } return prefix; } };
  • 时间复杂度:O(n)
    n为字符串数组的长度。
  • 空间复杂度:O(1)
posted @   Flix  阅读(1298)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示
CONTENTS