1. 程式人生 > >LeetCode最長字首問題reference binding to null pointer of type 'struct value_type'

LeetCode最長字首問題reference binding to null pointer of type 'struct value_type'

在刷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 "";
}