力扣14.最长公共前后缀
作者:互联网
CommonPre函数:把字符串数组一分为二,分别求出左右两边数组的最长公共前后缀 left 和 right,然后将两者进行比较得到最终的 最长公共前后缀
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 return CommonPre(strs,0,strs.size() - 1); 5 } 6 7 private: 8 string CommonPre(vector<string>& strs,int l,int r){ 9 if(l == r) return strs[l]; //数组里只包含一个字符串时,返回这个字符串 10 int mid = (l + r) / 2; 11 string left = CommonPre(strs,l,mid); //左边数组的最长公共前后缀 12 string right = CommonPre(strs,mid + 1,r); //右边数组的最长公共前后缀 13 int ll = left.length() > right.length() ? right.length() : left.length(); 14 string res; //接下来就是比较左右两边最长公共前后缀,得到数组的最长公共前后缀 15 for(int i = 0;i < ll;i ++){ 16 if(left[i] == right[i]) 17 res += left[i]; 18 else 19 break; 20 } 21 return res; 22 } 23 };
------------------分割线------------------
其他解法
把第一个字符作为最开始的最长公共前后缀res,然后拿第二个字符串和它自己(res)比较得出两者最长公共前后缀,更新res,然后res继续和第三个字符串比较......直到和最后一个字符串比较完,得到最终结果。(如果中间发现res为空则可直接返回res)
1 class Solution { 2 public: 3 string longestCommonPrefix(vector<string>& strs) { 4 string res = strs[0]; 5 for(int i = 1;i < strs.size();i ++){ 6 res = CommonPre(res,strs[i]); 7 if(res.empty()) return res; 8 } 9 return res; 10 } 11 12 private: 13 string CommonPre(string s,string t){ //求两个字符串最长公共前后缀可按自己想法写,譬如这里还可用双指针求 14 string res; 15 int ll = s.length() > t.length() ? t.length() : s.length(); 16 for(int i = 0;i < ll;i ++){ 17 if(s[i] == t[i]) 18 res += s[i]; 19 else 20 break; 21 } 22 return res; 23 } 24 };
标签:int,14,后缀,res,力扣,strs,length,string 来源: https://www.cnblogs.com/balabalabubalabala/p/16539364.html