C++ 寻找最长公共前缀 [LeetCode 14]
题目:
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs = ["flower","flow","flight"] 输出:"fl" 示例 2: 输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。 提示: 1 <= strs.length <= 200 0 <= strs[i].length <= 200 strs[i] 仅由小写英文字母组成
链接:https://leetcode-cn.com/problems/longest-common-prefix
思路:
纵向:从下标0开始,判断每一个字符串的下标0,判断是否全部相同。直到遇到不全部相同的下标。时间性能为O(n*m)。
横向:前两个字符串找公共子串,将其结果和第三个字符串找公共子串……直到最后一个串。时间性能为O(n*m)。
第一次提交时我才用的是横向比较,代码如下:
class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0) return ""; if(strs.size()==1||strs[0]=="") return strs[0]; string tempString=strs[0]; string samePre=""; for(int i=1;i<strs.size();i++) { samePre=""; for(int j=0;j<strs[i].size()&&j<tempString.size();j++) { if(strs[i][j]==tempString[j]) samePre+=tempString[j]; else break; } if(samePre=="") { tempString=""; break; } else tempString=samePre; } return tempString; } };
运行4ms,内存8.8M,双80%+的结果,循环嵌套耗费了大量的时间,而且开辟了两个string类型的内存空间,说明这个类暴力算法没有靠近最优解。
有网友提供了一种字典排序的思想,即这些字符串排序后,若有公共前缀,只需要比较第一个和最后一个字符串的公共前缀即可,类似夹逼法:
class Solution { public: string longestCommonPrefix(vector<string>& strs) { sort(strs.begin(),strs.end()); string &first=strs.front(); string &last=strs.back(); int i=0; while(i<last.size()&&i<first.size()&&first[i]==last[i]) { ++i; } return string(first.begin(),first.begin()+i); } };
最好情况是0ms,内存8.7M,几乎双百的结果,时间复杂度主要由sort函数决定
荡尘涤污,重整河山,便在今日