题目大意:给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
题目分析:枚举所有可能的子串,统计出现次数,找出符合条件的那个。
在枚举的过程中要按照长度的大小存储子串,因为以某个字母为首的子串,长度越长,优先级越高。此外,按照出现的前后,同样次数的出现的越早,优先级越高。
此外,用map数据结构存储子串,和子串出现的次数,是一个不错的选择。另外,map中的key是按照字母表的顺序排列的,所以在比较出现次数时,要按照substr数组的顺序遍历。
代码展示:
#include <iostream>
#include <map>
using namespace std;
int main(){
int L;
cin>>L;
string str;
cin>>str;
map<string,int> m;
int len = (int)str.length();
string substr[2000]; //所有的子串保存在substr中
int k=0;
for(int i=0;i<len-L+1;i++){ //从str[i]开始的字符串
for(int j=len-i;j>=L;j--){ //str[i]的长度,由长到短,因为较长的优先级高
substr[k] = str.substr(i,j);
m[substr[k]]++;
k++;
}
}
int max = m[substr[0]];
string str_print = substr[0];
for(int i=1;i<k;i++){
if(m[substr[i]] > max){
max = m[substr[i]];
str_print = substr[i];
}
}
cout<<str_print;
return 0;
}