
方法一:纵向扫描
思路:先获取字符串个数和最短字符串长度,然后从前往后遍历所有字符串的每一列,比较字符是否相投。
class Solution {
public:
static string longestCommonPrefix(vector<string>& str) {
if (!str.size()){
return "";
}
int min_length = str[0].size();
int count = str.size(); //字符串个数
for(int i = 1;i < count; ++i){
if(str[i].size()<=min_length){
min_length = str[i].size()+1;//加一一开始漏了,没有考虑到位
}
}
//cout << min_length <<endl;
for(int i = 0;i < min_length;++i){
char c = str[0][i];
for(int j = 1; j <count ; ++j){
if(str[j][i]!=c){
return str[0].substr(0,i);
}
}
}
return str[0];
}
};
方法二:横向扫描
写不动了,以后补
方法三:字典序
思路:将字符串数组以字典序排序,然后遍历比较第一个和最后一个字符串的字符,可得最长前缀。
class Solution {
public:
static string longestCommonPrefix(vector<string>& str) {
sort(str.begin(),str.end());
string &s1=str.front();
string &s2=str.back();
cout << s1 <<endl;
int i=0;
while(i<s1.size()&&i<s2.size()&&s1[i]==s2[i]){
++i;
}
return string(s1.begin(),s1.begin()+i);
}
};
附测试主函数:
int main()
{
vector<string> str = {"flower","flight","flow"};
string ret = Solution::longestCommonPrefix(str);
cout << ret << endl;
return 0;
}