美文网首页
[35]最大子序列-百度2018秋

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

作者: jdzhangxin | 来源:发表于2018-10-28 17:22 被阅读15次

    1.题目描述

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

    • 输入描述:
      输入包括一行,一个字符串s,字符串s长度length(1≤length≤50).
      s中每个字符都是小写字母
    • 输出描述:
      输出一个字符串,即字典序最大的s的子序列。
    • 输入示例:
      test
      
    • 输出示例:
      tt
      

    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;
    }
    

    牛客题目

    相关文章

      网友评论

          本文标题:[35]最大子序列-百度2018秋

          本文链接:https://www.haomeiwen.com/subject/bqtpoftx.html