对于字符串x和y, 如果擦除x中的某些字母(有可能全擦掉或者都不擦)能够得到y,我们就称y是x的子序列。例如."ncd"是"nowcoder"的子序列,而"xt"不是。
现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。
输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 50). s中每个字符都是小写字母
输出一个字符串,即字典序最大的s的子序列。
test
tt
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
char[] s = in.next().toCharArray();
int max = 0;
while (max < s.length) { //每次找最大的
for (int i = max; i < s.length; i++) { //从最大的右侧重新找最大的
if (s[i] > s[max]) max = i;
}
System.out.print(s[max]);
max++;
}
}
} import java.util.*;
import java.lang.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] s = sc.next().toCharArray();
List<Character> ret = new ArrayList<>();
backtrack(s, 'a', 0, ret);
String ans = "";
for(int i = 0; i < ret.size(); i++) {
ans += ret.get(i);
}
System.out.println(ans);
}
public static void backtrack(char[] s, char max, int maxIdx, List<Character> ret) {
if(s.length == 0) return;
for(int i = 0; i < s.length; i++) {
if(s[i] > max) {
max = s[i];
maxIdx = i;
}
}
ret.add(max);
//System.out.println(Arrays.copyOfRange(s, maxIdx, s.length));
backtrack(Arrays.copyOfRange(s, maxIdx+1, s.length), 'a', maxIdx, ret);
}
}
这里我必须要说一个问题,字典序较大,就是两个字符串中比较大的元素,也就是java中compareTo的实现。好吧!我***了,哈哈哈。既然要找最的字典序,肯定要找开头最大。贪心算法,从后往前找,如果前者比后者大,则保留,否则就删除。
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
char[] res = str.toCharArray();
ArrayList<Character> arr = new ArrayList<>();
arr.add(res[res.length-1]);
for (int i = res.length-1; i > 0; i--){
if ( arr.get(arr.size()-1) <= res[i-1]){
arr.add(res[i-1]);
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.size(); i++){
sb.append(arr.get(i));
}
System.out.println(sb.reverse().toString());
}
}