思路:
这个题目需要明确的是字符串最长公共前缀,所以如果存在这么的前缀,数组的每个字符串都有这样的前缀,有一个没有这样的前缀就返回空。所以难点是找存在这样的前缀,但要如何找出他最大的长度。
这里我是看到评论用python的特性,他能按照字符串的ASCII码进行排序,所以自己用C++实现了一下。
C++用sort进行排序,排序的标准是 比较两个字符串,找到第一个不同的字母,比较这两字母的ascii大小,并顺序排序。
然后我们取排序后的数组的第一个字符串和最后一个字符串,一直比较他们的字母是否相同,相同就加入res字符串中,遇到第一个不同的字母就break出循环,然后直接返回res字符串就可。
为什么取第一个和最后一个呢?因为我们前面说了,必须所有的字符串都有那么的前缀,才存在这样的前缀,所以如果有一个字符串不满足,那他就会第一个字母就不相同,他要么排第一个要么排在最后,所以我们就能返回空字符串。如果有这样的前缀,我们需要找到它的长度,那么按照这样的排序,不会让拥有公共前缀的字符串放在第一个字符串和最后一个字符串之间,因此我们就能找到最长的公共前缀。
例如我们的方法可以让abb,a,abz,会排成a,abb,abz
代码:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int n=strs.size();
sort(strs.begin(),strs.end(),[](string a,string b){
int al=a.length(),bl=b.length();
int n = min(al,bl);
int i=0;
for(;i<n;++i){
if(a[i]!=b[i]) break;
}
return (a[i]-‘a‘)<(b[i]-‘a‘);
});
int l0=strs[0].length(),l1=strs[n-1].length();
int l = min(l0,l1);
string res = "";
for(int i=0;i<l;++i){
if(strs[0][i]==strs[n-1][i]) res += strs[0][i];
else break;
}
return res;
}
};
原文:https://www.cnblogs.com/Mrsdwang/p/14811600.html