这题主要难在构建关联容器,方法很多,但是核心都是把原字符串一截一截减下来处理,先把前面用空格隔开的次数转化为整数,然后处理后面的多层子域。
方法一,查找标志字符,用标志字符把字符串分成几段
static int wing=[]()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return ;
}(); class Solution
{
public:
vector<string> subdomainVisits(vector<string>& cpdomains)
{
unordered_map<string,int> simap;
for(string &s:cpdomains)
{
int i=s.find(" ");
int times=stoi(s.substr(,i));
string ss=s.substr(i+,s.size()-i-);
simap[ss]+=times;
int sssz=ss.size();
for(int i=;i<sssz;i++)
{
if(ss[i]=='.')
simap[ss.substr(i+,sssz-i-)]+=times;
}
}
vector<string>res;
for(auto &p:simap)
res.push_back(to_string(p.second)+" "+p.first);
return res;
}
};
方法二,用stringstream
static int wing=[]()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return ;
}(); class Solution
{
public:
vector<string> subdomainVisits(vector<string>& cpdomains)
{
unordered_map<string,int> simap;
for(string &s:cpdomains)
{
stringstream ss;
int cnt=;
string dom;
ss<<s;
ss>>cnt>>dom;
simap[dom]+=cnt;
int sz=dom.size();
for(int i=;i<sz;i++)
{
if(dom[i]=='.')
simap[dom.substr(i+,sz-i-)]+=cnt;
}
}
vector<string> res;
for(auto &p:simap)
res.push_back(to_string(p.second)+" "+p.first);
return res;
}
};
用stringstream的方法速度要慢一些