class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0)
{
return "";
}
if (strs.size() == 1)
{
return strs[0];
}
int len = strs.size();
int nminSize = 0;
for (int i = 0; i < len-1; i++)
{
if (strs[i].size()>=strs[i + 1].size())
nminSize = strs[i + 1].size();
else//新改的
nminSize = strs[i].size();
}//求出最小值
bool matchFlag = true;
int matchIndex = 0;
for (int j = 0; j < strs[0].size(), j<nminSize; matchIndex++, ++j)
{
for (int i = 0; i < len-1; ++i)
{
if (/*j < nminSize&&*/strs[i][j] == strs[i + 1][j])//注释起来的加到条件中,
{
}
else
{
matchFlag = false;
break;
}
}
if (matchFlag == false)
{
//matchIndex = j; matchindex加到上面++那里
break;
}
}
//sleep(1);
return strs[0].substr(0, matchIndex);
}
};
这是自己写的算法.主要三点:
1.求出数组中字符串的最小值
2.第一个字符串大小,然后循环
3.根据循环下标j和minsize对比,如果j>minsize,证明循环到了数组中的一个字符串的末尾,不能比较,退出
回头看下答案,可有以下优化:
找字符串的最小值,用nminSize代替,不如用循环遍历,定义一个string min,然后循环得到数组中字符串的最小值,然后赋值给min, 接下来的循环就可以循环这个min的每个字符了.
如下所示
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ans = "";
if(strs.empty()) return ans; //输入为空,输出空ans
int arr = strs.size();
string min = strs[0];
for(int i = 1; i < arr; ++ i) //找到最短字符串
{
if(strs[i].size() < min.size())
min = strs[i];
}
for(int j = 0; j < min.size(); ++ j) //从第一个字符开始对比,若都一样,ans加上该字符,若不一样,返回答案;
{
for(int m = 0; m < arr; ++m)
{
if(min[j] != strs[m][j])
return ans;
}
ans = ans + min[j];
}
return ans;
}
};
这个方法也不错,根据j下标最长匹配段,每次和待比较的字符串的长度进行比较.
class Solution {
public:
string longestCommonPrefix(vector<string>& vec) {
if (vec.size() == 0)
{
return "";
}
int j = 0;//记录最大公共长度
while (true)
{
for (int i = 0; i < vec.size(); i++)
{
if (j > vec[i].size())
{
return vec[0].substr(0, j);
}
char c = vec[0][j];
if (c != vec[i][j])
{
return vec[0].substr(0, j);
}
}
j++;//不能放到里面,否则第一次匹配,21行和22行判断的都是第一个字符串的第一个字符
}
return vec[0].substr(0, j);
};
};