####################################################################################################

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

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

示例 1:

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

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

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

来源:力扣(LeetCode)

####################################################################################################

第一种解法:纵向比较,取第一个字符串,和其他字符串纵向比较,如果有一个不同或遇到最短的字符串已经比较完了 i已经到了strs[j].size()【实际上的序号会比长度少1,所以i已经比较过第j个字符串的最后一个字符】,则返回substr(0,i),是不会包括 i 的,如果没有在if语句中跳出,则返回第一个字符串[否则会出现编译错误,函数可能没有返回值]

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()== 0)
            return "";
        
        int count = strs.size() , length = strs[0].size();
        for(int i = 0; i<length;i++){
            char c = strs[0][i];
            for(int j=1; j<count; j++){
                if( i == strs[j].size() || c!=strs[j][i])
                    return strs[0].substr(0,i);
            }
        }
        return strs[0];
    }
};
####################################################################################################
第二种解法:二分查找
应用到c++查找最小元素*min_element,请参考https://www.jianshu.com/p/959ac770fb17,可以自定义函数
找最小长度的字符串,用二分查找的方式去确定比较的字符串,进行对比,最后确定最长的前缀,把low当作比较的起点
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
       if (!strs.size()) {
            return "";
        }
        int minLen = min_element(strs.begin(),strs.end(),[](const string &s1,const string &s2){return s1.size()<s2.size();})->size();
        int low = 0, high = minLen;
        while(low<high){
            int mid = (high-low+1)/2+low;
            if(isCommonPrefix(strs, mid,low)){
                low = mid;
            }else{
                high = mid-1;
            }

        }
        return strs[0].substr(0,low);
         
    }
//比较最长前缀
    bool isCommonPrefix(const vector<string>& strs, int length,int start) {
      string str0 = strs[0].substr(0,length);
       int count = strs.size();
       for(int i=1; i<count; i++){
           for(int j=start; j<length;j++){
              if(str0[j]!=strs[i][j]){
                  return false;
              }
           }
       }
       return true;
    }
};
 
 
posted on 2020-08-01 09:15  houquan  阅读(210)  评论(0编辑  收藏  举报