C++ 如何存储不同的字符';使用矢量或地图定位
我有一个类似“aabcdba”的字符串,现在我想存储不同字符位置的位置。我正在尝试使用C++ 如何存储不同的字符';使用矢量或地图定位,c++,C++,我有一个类似“aabcdba”的字符串,现在我想存储不同字符位置的位置。我正在尝试使用向量和无序映射进行存储。有没有好的方法来存储不同字符的位置 void topKFrequent(string s) { vector<vector<int> >v(123); //unordered_map<char, vector<int>>m; for(int i=0;i<s.size();i++) { v[s[i
向量和无序映射进行存储。有没有好的方法来存储不同字符的位置
void topKFrequent(string s) {
vector<vector<int> >v(123);
//unordered_map<char, vector<int>>m;
for(int i=0;i<s.size();i++) {
v[s[i]].push_back(i);
// m[s[i]].push_back(i);
}
for(int i=0;i<123;i++) {
for(int j=0;j<v[i].size();j++) {
char ch=i;
cout<<ch<<"->"<<v[i][j]<<endl;
}
}
}
存储位置的一个可能实现是使用无序的_multimap:(其中关键字符可以重复)
要打印数据,可以使用以下方法:
void printPos()
{
std::multimap<char,int>::iterator it,itup;
for (it = m.begin(); it != m.end(); )
{
cout << (*it).first << " -> ";
itup = m.upper_bound ((*it).first );
// print range [it,itup):
for (it; it!=itup; ++it)
{
cout << (*it).second << ", ";
}
cout << endl;
}
}
您可以使用地图
#包括
#包括
#包括
#包括
使用名称空间std;
map storePos(字符串s)
{
查波斯地图;
for(int i=0;等秒推回(i);
}
其他的
{
charPos[s[i]]=向量(1,i);
}
}
返回charPos;
}
内部主(空)
{
字符串示例=“aabcdba”;
自动结果=storePos(示例);
对于(自动itr1=result.begin();itr1!=result.end();itr1++)
{
cout second.end();
itr2++)
{
cout如果您确实想在原始字符串序列中存储有序位置,可以使用char
到vector
的无序或有序映射来实现,其中char
是键,vector
包含这些位置。使用无序映射不会给出ke的字典顺序您似乎在寻找Y,但仍将为您提供准确的位置向量
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
int main()
{
std::string s = "aabcdba";
std::unordered_map<char, std::vector<unsigned int>> mymap;
for (unsigned i=0; i<s.size(); ++i)
mymap[s[i]].push_back(i);
for (auto const& pr : mymap)
{
std::cout << pr.first << "->";
auto it = pr.second.cbegin();
std::cout << *it;
while (++it != pr.second.cend())
std::cout << ',' << *it;
std::cout << ";\n";
}
}
如果您想要按字典顺序排列,最简单的替代方法是简单地使用常规的有序映射。仅更改以下内容:
std::unordered_map<char, std::vector<unsigned int>> mymap;
这正好符合你想要的。为什么你需要存储这些位置?你到底想解决什么问题?请稍等片刻,了解一下原因背后的原因,因为你发布的代码使用向量向量方法调用了未定义的行为,我同意不这样做。我正在尝试解决一个问题问题是:“给定一个非空字符串str和一个整数k,重新排列字符串,使相同的字符之间至少有k个距离。”是@WhozCraig代码没有运行,我想知道正确的实现方式,以及是否有其他存储方式,因为如果我使用2d vector,那么我必须将1索引到123,但我只想将char映射到它的位置。现在上面的代码运行良好,但我无法使用无序的映射实现。@WhozCraigif string=“aabb”,您的输出:a->0;a->1;b->2;b->3;但我需要:a->0,1;b->2,3
void printPos()
{
std::multimap<char,int>::iterator it,itup;
for (it = m.begin(); it != m.end(); )
{
cout << (*it).first << " -> ";
itup = m.upper_bound ((*it).first );
// print range [it,itup):
for (it; it!=itup; ++it)
{
cout << (*it).second << ", ";
}
cout << endl;
}
}
a -> 0, 1, 6,
b -> 2, 5,
c -> 3,
d -> 4,
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
map<char, vector<unsigned int> > storePos(string s)
{
map<char, vector<unsigned int> > charPos;
for(int i=0;i<s.size();i++)
{
auto itr = charPos.find(s[i]);
if(itr != charPos.end())
{
itr->second.push_back(i);
}
else
{
charPos[s[i]] = vector<unsigned int>(1, i);
}
}
return charPos;
}
int main(void)
{
string example = "aabcdba";
auto result = storePos(example);
for(auto itr1 = result.begin(); itr1 != result.end(); itr1 ++)
{
cout << "Letter: " << itr1->first << ", Locations: ";
for(auto itr2 = itr1->second.begin(); itr2 != itr1->second.end();
itr2 ++)
{
cout << *itr2 << " ";
}
cout << endl;
}
}
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
int main()
{
std::string s = "aabcdba";
std::unordered_map<char, std::vector<unsigned int>> mymap;
for (unsigned i=0; i<s.size(); ++i)
mymap[s[i]].push_back(i);
for (auto const& pr : mymap)
{
std::cout << pr.first << "->";
auto it = pr.second.cbegin();
std::cout << *it;
while (++it != pr.second.cend())
std::cout << ',' << *it;
std::cout << ";\n";
}
}
d->4;
c->3;
b->2,5;
a->0,1,6;
std::unordered_map<char, std::vector<unsigned int>> mymap;
std::map<char, std::vector<unsigned int>> mymap;
a->0,1,6;
b->2,5;
c->3;
d->4;