编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 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 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。