采用暴力法搜索,可以利用STL库中的set来维护当前遍历到的子串,因为set结构会自动按字典序排序。但是有以下两点可以简化程序的地方:
①枚举的子串长度应该小于k,显然,因为如果子串长度大于k,则该子串的从0到k-1的子串才为结果,因此长度大于k的子串必不为答案。
②维护的set的大小应该等于k,当插入某个元素后,set的大小等于k-1,则应该删除该set的最后一个元素。那么这个时候set中的k个元素,就是遍历到的字符串按字典序排序后,前k个字符串。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int k;
cin>>k;
set<string>se;
int n=s.size();
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(j-i+1>k){
//要求子串的大小
break;
}
string temp=s.substr(i,j-i+1);
se.insert(temp);
if(se.size()==k+1){
//维护set的大小
se.erase(--se.end());
}
}
}
cout<<*(--se.end());
return 0;
}