其他分享
首页 > 其他分享> > 力扣14.最长公共前后缀

力扣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