LeetCode最長字首問題reference binding to null pointer of type 'struct value_type'
阿新 • • 發佈:2018-12-12
在刷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 ""; }