对于字符串x和y, 如果擦除x中的某些字母(有可能全擦掉或者都不擦)能够得到y,我们就称y是x的子序列。例如."ncd"是"nowcoder"的子序列,而"xt"不是。
现在对于给定的一个字符串s,请计算出字典序最大的s的子序列。
输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 50). s中每个字符都是小写字母
输出一个字符串,即字典序最大的s的子序列。
test
tt
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()); } }