LeetCode14:最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

 

纵向扫描

按顺序对比每个字符串的每一个字符,遇到不同的就返回已经匹配的内容,否则就返回第一个字符串的全部内容。

 1 class Solution {
 2 public:
 3     string longestCommonPrefix(vector<string>& strs) {
 4         cout<<"in coming"<<endl;
 5         int n=strs.size(),min=9999;
 6         if(n==0) return "";
 7         cout<<n<<endl;
 8         vector<int> s(n);
 9         for(int i=0;i<n;i++)
10             if(strs[i].size()<min) min=strs[i].size();
11         cout<<min<<endl;
12         int i=0,len=0;
13         char cur;
14         while(i<min){
15             cur=strs[0][i];
16             cout<<cur<<endl;
17             for(int j=1;j<n;j++){
18                 if(strs[j][i]!=cur){
19                     return strs[0].substr(0,len);
20                 }
21             }
22             len++;
23             cout<<len<<endl;
24             i++;
25         }
26       
27     
28     cout<<"before return";
29     return strs[0].substr(0,len);}
30 };

时间复杂度为O(mn),m为字符串的平均长度,n为字符串数量。空间复杂度O(1)。

 

排序后对比头尾

直接对字符串进行排序,然后比较第一个和最后一个,直接返回匹配的内容。

 1 class Solution {
 2 public:
 3     string longestCommonPrefix(vector<string>& strs) {
 4         if(strs.empty()) return "";
 5         const auto p = minmax_element(strs.begin(), strs.end());
 6         for(int i = 0; i < p.first->size(); ++i)
 7             if(p.first->at(i) != p.second->at(i)) return p.first->substr(0, i);
 8         return *p.first;
 9     }
10 };
11 
12 作者:you-yuan-de-cang-qiong
13 链接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zi-dian-xu-zui-da-he-zui-xiao-zi-fu-chuan-de-gong-/
14 来源:力扣(LeetCode)
15 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2020-06-25 11:07  __rookie  阅读(158)  评论(0编辑  收藏  举报