在刷LeedCode的求最长前缀问题时遇到如下问题:
直觉上就是访问数组越界,但是一直找不出问题。出问题的代码如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string ansStr;
for (int i = 0; i < strs[0].size(); i++)//以第一个字符串为准,一个字符一个字符地与后面比较
{
for (int index = 1; index < strs.size(); index++)
{
if(ansStr.size() == strs[index].size() || (strs[0].substr(0, i + 1) != strs[index].substr(0, i + 1)))
return ansStr;//如果后面的字符串比最长前缀结果短或者有不一样的字符时就返回
}
ansStr = strs[0].substr(0, i + 1);//更新最长前缀字符串结果
}
if(!ansStr.empty())//非空返回
return ansStr;
return "";//返回空字符串
}
};
后来找到问题是,测试用例如果直接给出一个空字符串的话,也就是说函数传进的是一个空的vector容器,那么在调用strs[0]的时候就会下标越界,因为strs[0]是不存在的。加上判断条件之后,顺利通过。感觉有点坑,很不容易注意,不过也说明LeedCode的测试用例还是很全面的!
最终代码如下:
string longestCommonPrefix(vector<string>& strs) {
string ansStr;
if(strs.empty())//不加这个传入为空的判断的话会访问越界
return "";
for (int i = 0; i < strs[0].size(); i++)
{
for (int index = 1; index < strs.size(); index++)
{
if(ansStr.size() == strs[index].size() || (strs[0].substr(0, i + 1) != strs[index].substr(0, i + 1)))
return ansStr;
}
ansStr = strs[0].substr(0, i + 1);
}
if(!ansStr.empty())
return ansStr;
return "";
}