美文网首页
最大子序列-(百度2018)

最大子序列-(百度2018)

作者: 天使的流浪 | 来源:发表于2019-01-10 10:14 被阅读0次

    题目:对于给定的字符串,请计算出字典序最大的s子序列;
    输入:test
    输出:tt
    分析:
    1.子序列:对于字符串x和y,如果擦除x中的某些字母(有可能全擦或者都不擦),能够得到y,我们称y为x的子序列;(在删除一些字符的基础上,不改变原有的字符串排列顺序)
    2.字典序:对于字符串,先按首字母排列,如果首字母相同,再按第二个字符排序;('12'<'13')
    实现(基于贪心):从后往前遍历,设置当前字符为最后一个字符,遇到等于或者大于该字符的则添加,当前字符为该字符,否则去掉,最后逆序输出;(在遍历过程中保证,之后添加的元素大于等于之前的最大元素);
    该题目中最后一个元素肯定在结果中:
    ① 当最后一个元素最小时,遍历其他元素结束后,加入最后一个元素;
    ②当最后一个元素最大时,直接输出该元素,其他元素不加入;
    ③当最后一个元素处于中间大小时,比它大的需要加入;
    所以遍历过程中参照最后一个元素,考虑其他元素是否可以加入;

    package com.bj.baidu;
    /**
     * 最大子序列:字典序('1'<'12'<'13')
     * ;
     */
    import java.util.Scanner;
    
    public class Test4 {
        @SuppressWarnings("resource")
        public static void main(String[] args) {
            //1.输入字符串
             String str = new Scanner(System.in).nextLine();
             StringBuffer sb = new StringBuffer();
             char chars [] = str.toCharArray();
             char c = chars[chars.length-1];
             sb.append(c);
             // 2.逆序比较大小,比当前的大则加入
             for (int i = chars.length-2; i >=0; i--) {
                if (chars[i]>=c) {
                    sb.append(chars[i]);
                    c = chars[i];
                }
            }
             //3.结果逆序输出
            char chars1 [] = sb.toString().toCharArray();
            for (int i = chars1.length-1; i>=0; i--) {
                System.out.print(chars1[i]);
            }
        }
    }
    

    知识点:
    1.StringBuffer、char数组以及String的操作;
    2.对于题目分析,分析结果,考虑其中关联;

    相关文章

      网友评论

          本文标题:最大子序列-(百度2018)

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