题目
题目链接
解题思路
这道题要求找出字典序最大的子序列,关键点是:
- 子序列不要求连续,但要保持原有顺序
- 需要找出字典序最大的子序列
- 可以删除任意数量的字符(包括全部删除或不删除)
解题步骤:
- 从后向前遍历字符串
- 维护一个当前见过的最大字符
- 如果当前字符大于等于已见过的最大字符,则选择该字符
- 这样可以保证得到字典序最大的子序列
代码
#include <iostream>
#include <string>
using namespace std;int main() {string s;cin >> s;string result;char maxChar = 'a' - 1; // 初始化为比'a'小的字符// 从后向前遍历for(int i = s.length() - 1; i >= 0; i--) {if(s[i] >= maxChar) {result = s[i] + result; // 在结果前面添加当前字符maxChar = s[i]; // 更新最大字符}}cout << result << endl;return 0;
}
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.next();StringBuilder result = new StringBuilder();char maxChar = (char)('a' - 1); // 初始化为比'a'小的字符// 从后向前遍历for(int i = s.length() - 1; i >= 0; i--) {if(s.charAt(i) >= maxChar) {result.insert(0, s.charAt(i)); // 在结果前面添加当前字符maxChar = s.charAt(i); // 更新最大字符}}System.out.println(result.toString());}
}
s = input()
result = []
max_char = chr(ord('a') - 1) # 初始化为比'a'小的字符# 从后向前遍历
for c in reversed(s):if c >= max_char:result.insert(0, c) # 在结果前面添加当前字符max_char = c # 更新最大字符print(''.join(result))
算法及复杂度
- 算法:贪心算法。从后向前遍历,保留所有不小于已见过的最大字符的字符。
- 时间复杂度:\(\mathcal{O}(n)\),其中n是字符串长度。
- 空间复杂度:\(\mathcal{O}(n)\),需要存储结果字符串。