Write a function to find the longest common prefix string amongst an array of strings.
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return string();
string comPre(strs[0]);
typedef string::size_type sz;
for (sz i = 1; i != strs.size(); ++i){
string tmp;
for (sz j = 0; j != comPre.size(); ++j) {
if (comPre[j] == strs[i][j])
tmp += comPre[j];
else break;
}
comPre = tmp;
}
return comPre;
}
};
参考后
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return string();
string comPre(strs[0]);
typedef string::size_type sz;
for (sz i = 1; i != strs.size(); ++i){
sz j = 0;
for (; j != comPre.size(); ++j) {
if (comPre[j] == strs[i][j]);
else break;
}
comPre = strs[i].substr(0, j);
}
return comPre;
}
};
divide and conqure
class Solution {
public:
typedef string::size_type sz;
typedef vector<string>::const_iterator iter;
string comPrefix(iter begin, iter end){
int num = end - begin;
if (num == 1) return *begin;
int mid = num / 2;
string lstr = *begin;
string rstr = *(begin + 1);
if (mid > 0) lstr = comPrefix(begin, begin + mid); // mid strings;
if (num - mid > 0) rstr = comPrefix(begin + mid, end); // num - mid strings
sz i = 0;
sz size = min(lstr.size(),rstr.size());
for (; i != size; ++i){
if (lstr[i] == rstr[i]) ;
else break;
}
return lstr.substr(0, i);
}
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty()) return string();
else if (strs.size() == 1) return strs[0];
else return comPrefix(strs.begin(), strs.end());
}
};