原题传送门

一道模拟题,然鹅我调了好久,是set锅

思路1

直接暴力,遇到每一个子串,都重新遍历一遍,判断其数量,再和已有的max比较,时间复杂度\(\mathcal O (n^2)\),由于字符串长度最长100,此解能过得去。
(这里就不放代码了)

思路2

利用mapvector(数组也行),用map储存每个子串的数量,vector储存每个子串,

vector<string> v;
map<string,int> mp;

然后再遍历字符串以获取每个子串以及和它相同的字串数量,

for(int i=0;i<n-1;i++){
   string x=str.substr(i,2);
   v.push_back(x);
   mp[x]++;
}

再通过map+vector算出每个子串(指一个子串及与它相等的子串)出现的数量即可。

 for(int i=0;i<n-1;i++){
   string x=v[i];
   if(mp[x]>mx)ans=v[i];
   mx=max(mx,mp[x]);
 }
    cout<<ans;

时间复杂度\(\mathcal O (n)\)

思路3

同思路2,将vector改为set去重,稍快一点,但时间复杂度没变,而且set容易写错,故不推荐。

The end.