题目:对于给定的字符串,请计算出字典序最大的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.对于题目分析,分析结果,考虑其中关联;
网友评论