这题主要难在构建关联容器,方法很多,但是核心都是把原字符串一截一截减下来处理,先把前面用空格隔开的次数转化为整数,然后处理后面的多层子域。

方法一,查找标志字符,用标志字符把字符串分成几段

 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的方法速度要慢一些

posted on 2018-06-14 15:41  高数考了59  阅读(411)  评论(0)    收藏  举报