一道模拟题,然鹅我调了好久,是set锅
思路1
直接暴力,遇到每一个子串,都重新遍历一遍,判断其数量,再和已有的max比较,时间复杂度\(\mathcal O (n^2)\),由于字符串长度最长100,此解能过得去。
(这里就不放代码了)
思路2
利用map和vector(数组也行),用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容易写错,故不推荐。