[35]最大子序列-百度2018秋

2018-10-28  本文已影响15人  jdzhangxin

1.题目描述

对于字符串x和y,如果擦除x中的某些字母(有可能全擦掉或者都不擦)能够得到y,我们就称y是x的子序列。例如."ncd"是"nowcoder"的子序列,而"xt"不是。
现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。

2.题目解析

字典序是单词按照字母序排列的顺序。如果第一个字母相同,比较第二个,依次类推。
例如:ab低于bcabc高于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;
}

牛客题目

上一篇下一篇

猜你喜欢

热点阅读