我正在尝试解决特定的leetcode问题,但似乎无法弄清楚哪里出了错。
问题是这个:https://leetcode.com/problems/group-anagrams/ 我的代码是:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& str) {
unordered_map<string, vector<int>> map;
vector<string> newstr = str;
int size = str.size();
//pushing those indices of `str` into the map which share common permutation
for(int i=0; i<size; i++){
sort(newstr[i].begin(), newstr[i].end());
map[newstr[i]].push_back(i);
}
vector<vector<string>> ans;
int i=0;
for(auto itr: map){
int v_size = itr.second.size();
for(int j=0; j<v_size; j++)
//cout<<str[itr.second[j]]<<" "; //this query works perfectly
ans[i].push_back(str[itr.second[j]]); //erroneous code
i++;
}
return vector<vector<string>>();
// return ans;
}
};
答案 0 :(得分:4)
您正在访问ans[i]
,而没有事先在ans
中分配任何内存。这将创建超出向量范围(0)的数据访问。
如果要向ans添加新矢量,请使用ans.push_back()
。正如balki所说,您还可以通过在声明时分配所有条目来删除冗余分配,如下所示:
vector<vector<string>> ans { map.size() };
这将使您的代码正常工作,而无需进行任何其他更改(据我所知)。
答案 1 :(得分:1)
使用时
ans[i].push_back(str[itr.second[j]]);
i
必须是有效的索引。由于您在调用之前尚未向ans
添加任何项目,因此ans
为空,并且出现了越界索引错误。更改定义ans
的行,以适当的大小对其进行初始化。
代替
vector<vector<string>> ans;
使用
vector<vector<string>> ans(map.size());
第二种选择是在循环中创建一个std::vector<std::string>
并将其添加到ans
。
for(auto itr: map){
int v_size = itr.second.size();
std::vector<std::string> v;
for(int j=0; j<v_size; j++)
v.push_back(str[itr.second[j]]);
ans.push_back(v);
}