这题主要难在构建关联容器,方法很多,但是核心都是把原字符串一截一截减下来处理,先把前面用空格隔开的次数转化为整数,然后处理后面的多层子域。
方法一,查找标志字符,用标志字符把字符串分成几段
1 static int wing=[]()
2 {
3 std::ios::sync_with_stdio(false);
4 cin.tie(NULL);
5 return 0;
6 }();
7
8 class Solution
9 {
10 public:
11 vector<string> subdomainVisits(vector<string>& cpdomains)
12 {
13 unordered_map<string,int> simap;
14 for(string &s:cpdomains)
15 {
16 int i=s.find(" ");
17 int times=stoi(s.substr(0,i));
18 string ss=s.substr(i+1,s.size()-i-1);
19 simap[ss]+=times;
20 int sssz=ss.size();
21 for(int i=0;i<sssz;i++)
22 {
23 if(ss[i]=='.')
24 simap[ss.substr(i+1,sssz-i-1)]+=times;
25 }
26 }
27 vector<string>res;
28 for(auto &p:simap)
29 res.push_back(to_string(p.second)+" "+p.first);
30 return res;
31 }
32 };
方法二,用stringstream
1 static int wing=[]()
2 {
3 std::ios::sync_with_stdio(false);
4 cin.tie(NULL);
5 return 0;
6 }();
7
8 class Solution
9 {
10 public:
11 vector<string> subdomainVisits(vector<string>& cpdomains)
12 {
13 unordered_map<string,int> simap;
14 for(string &s:cpdomains)
15 {
16 stringstream ss;
17 int cnt=0;
18 string dom;
19 ss<<s;
20 ss>>cnt>>dom;
21 simap[dom]+=cnt;
22 int sz=dom.size();
23 for(int i=0;i<sz;i++)
24 {
25 if(dom[i]=='.')
26 simap[dom.substr(i+1,sz-i-1)]+=cnt;
27 }
28 }
29 vector<string> res;
30 for(auto &p:simap)
31 res.push_back(to_string(p.second)+" "+p.first);
32 return res;
33 }
34 };
用stringstream的方法速度要慢一些