编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。说明:
所有输入只包含小写字母 a-z 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-common-prefix
分析:
方法1:找到最短的的字符串,然后拿最短字符串的每个字母去所有字符串中验证(验证该字符在每个字符串中都存在)
时间复杂度:O(S),S为所有字符串中字符数量的总和
最好情况:O(N*minL),N为字符串数量,minl为最短字符串的数量
最坏情况:O(N*M)(N个长度为M的相同字符串)
空间复杂度:O(1)
方法2:找到最短字符串,然后对最短字符串的长度进行二分,每次得到长度mid,就去验证长度mid是否符合要求(验证方法:看看所有字符串的前mid个字符是否相同)
时间复杂度:O(S*log(minl)),S为所有字符串的字符数量,minl为最短字符串的长度
空间复杂度:O(1)
方法1:
class Solution { public: string longestCommonPrefix(vector<string>& v) { int n=v.size(); if(n==0) return ""; if(n==1) return v[0]; int minl=INT_MAX; int index=0; for(int i=0;i<n;i++) { int k=v[i].size(); if(k<minl) { minl=k; index=i; } } string ans; for(int j=0;j<=minl;j++) { for(int i=0;i<n;i++) { if(v[i][j]==v[index][j]) continue; else return ans; } ans+=v[index][j]; } return ans; } };
方法2:
class Solution { public: string longestCommonPrefix(vector<string>& v) { int n=v.size(); if(n==0) return ""; if(n==1) return v[0]; if(n==2&&v[0]==v[1]) return v[0]; int minl=v[0].length(); for(int i=1;i<n;i++) { int k=v[i].size(); if(v[i][0]!=v[i-1][0]) return ""; if(k==0) { return ""; } if(k<minl) { minl=k; } } string ans=v[0].substr(0,1); int start=0; int end=minl; while(start<=end) { int mid=(start+end)/2; string str=v[0]; int flag=1; for(int i=1;i<n;i++) { if(str.substr(0,mid)!=v[i].substr(0,mid)) { flag=0; break; } } if(flag==1) { start=mid+1; ans=str.substr(0,mid); }else { end=mid-1; } } return ans; } };