[35]最大子序列-百度2018秋
2018-10-28 本文已影响15人
jdzhangxin
1.题目描述
对于字符串x和y,如果擦除x中的某些字母(有可能全擦掉或者都不擦)能够得到y,我们就称y是x的子序列。例如."ncd"是"nowcoder"的子序列,而"xt"不是。
现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。
- 输入描述:
输入包括一行,一个字符串s,字符串s长度length(1≤length≤50).
s中每个字符都是小写字母 - 输出描述:
输出一个字符串,即字典序最大的s的子序列。 - 输入示例:
test
- 输出示例:
tt
2.题目解析
字典序是单词按照字母序排列的顺序。如果第一个字母相同,比较第二个,依次类推。
例如:ab
低于bc
;abc
高于aba
。
贪心法:每次取最优解。从前往后查找最大字母,然后再查找第二大字母,以此类推。
3.参考答案
#include <bits/stdc++.h>
using namespace std;
int find_max(string s,int start){
int pos = start;
char max_char = s[pos];
for(int i=start+1;i<s.size();++i){
if(s[i] > max_char){
max_char = s[i];
pos = i;
}
}
return pos;
}
int main(){
string s;
cin >> s;
string res;
int pos = 0;
while(pos < s.size()){
pos = find_max(s,pos);
res.append(1,s[pos]);
++pos;
}
cout << res;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
string res;
while (!s.empty()) {
// 查找最大字母的位置
string::iterator it = max_element(s.begin(), s.end());
// 把最大字母放到结果种
res.append(1,*it);
// 删除最大字母前的部分,继续查找
s.erase(s.begin(), it + 1);
}
cout << res << endl;
return 0;
}