SICAU-OJ: 第k小
第k小
题意:
给出一个长度不超过5000的字符串,然后让你找出第K小的字串(1<=K<=5)。重复的串大小相等。
题解:
这里我们知道某些串的前缀是肯定小于等于其本身的。
那么长度为5的串的前缀,肯定依次是最小,第二小....第五小。
所以因为这里1<=K<=5,我们便可以用一个set来维护所有长度不超过5的子串。要用点贪心的思想去解决(每次从最小的那个字符开始选子串)
代码如下:
#include <bits/stdc++.h> using namespace std; const int N = 5005; char s[N]; set <char> tmp; set <string> S; int k; int main(){ scanf("%s",s); scanf("%d",&k); int len =strlen(s); for(int i=0;i<len;i++) tmp.insert(s[i]); while(1){ auto it = tmp.begin(); auto now = *it; for(int i=0;i<len;i++){ if(s[i]==now){ char c[N];int tot=0;; for(int j=i;j<len;j++){ c[tot++]=s[j]; c[tot]='\0'; S.insert(c); if(tot-1>k) break; } } } int flag=0; int num=S.size(); tmp.erase(it); if(num>=k){ flag=1;int cnt=0; for(auto it2 = S.begin();it2!=S.end();it2++){ cnt++; if(cnt==k){ cout<<*it2; break; } } } if(flag) break; } return 0; }
重要的是自信,一旦有了自信,人就会赢得一切。