1. 题目描述
Write a function to find the longest common prefix string amongst an array of strings.
2. 解决思路
我们知道字符串前缀的定义是不包括该字符串最后一个字符的其他字符的有序组合,但在这道题中,最长的公共前缀应该可以包括最后一个字符,相当于前缀加空字符串(而且这个对算法不影响)。
所以这道题我主要的解题思路就是是最长公共字符串肯定不会比整个数组中最短的长,顶多相等。
基于此,我们假设第一个是公共串,让他和后面的挨个对比,如果它比后面的短,那么就逐个字符对比,如果共同的比当前的短则截断,这样遍历一次即可获得最短公共串,也即最长的公共前缀。
3. 完整代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string longestCommonPrefix(vector<string> strs){
if (strs.size()==0)
return "";
string prefix = strs[0]; //定义最长的公共前缀并赋初值
for (int i = 1; i < strs.size(); i++){
//将当前最长的公共前缀和当前数组中的对比,把小的那个作为长度
int len = prefix.length() > strs[i].length() ? strs[i].length() : prefix.length();
int j = 0;
for (j = 0; j < len; j++){
//逐个字符比较,不等的时候退出
if (prefix.at(j) != strs[i].at(j))
break;
}
//退出的j即当前的最小,整个遍历结束后就是整个的最小了
prefix = prefix.substr(0, j);
}
return prefix;
}
int main() {
vector<string> strs;
for (int i = 0; i<100; i++){
string temp;
cin >> temp;
if(cin.peek() != '\n'){
strs.push_back(temp);
}
else
break;
}
string result = longestCommonPrefix(strs);
cout << "最长的公共前缀是:" << result << endl;
return 0;
}