-
https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/
给你一个字符串 s 和一个机器人,机器人当前有一个空字符串 t 。执行以下操作之一
,直到 s 和 t 都变成空字符串。请你返回纸上能写出的字典序最小的
字符串: -
操作一:删除字符串 s 的 第一个字符,并将该字符给机器人。机器人把这个字符添加到 t 的尾部。
-
操作二:删除字符串 t 的 最后一个 字符,并将该字符给机器人。机器人将该字符写到纸上。
示例 1:
输入:s = "zza"
输出:"azz"
解释:用 p 表示写出来的字符串。
一开始,p="" ,s="zza" ,t="" 。
执行第一个操作三次,得到 p="" ,s="" ,t="zza" 。
执行第二个操作三次,得到 p="azz" ,s="" ,t="" 。
示例 2:
输入:s = "bac"
输出:"abc"
解释:用 p 表示写出来的字符串。
执行第一个操作两次,得到 p="" ,s="c" ,t="ba" 。
执行第二个操作两次,得到 p="ab" ,s="c" ,t="" 。
执行第一个操作,得到 p="ab" ,s="" ,t="c" 。
执行第二个操作,得到 p="abc" ,s="" ,t="" 。
示例 3:
输入:s = "bdda"
输出:"addb"
解释:用 p 表示写出来的字符串。
一开始,p="" ,s="bdda" ,t="" 。
执行第一个操作四次,得到 p="" ,s="" ,t="bdda" 。
执行第二个操作四次,得到 p="addb" ,s="" ,t="" 。
提示:
1 <= s.length <= 105
s 只包含小写英文字母。
题解
-
有一个初始为空的栈t,给定字符的入栈顺序,求字典序最小的出栈序列。因为是最小的字典序列,所以本题可以使用贪心策略。文章来源:https://www.toymoban.com/news/detail-620782.html
-
对于任意时刻,当前可供选择的字符包括栈顶元素(如果栈非空),没有入栈的元素(当前索引i及之后的全部元素),我们从这两个元素中选取最小值,进行操作文章来源地址https://www.toymoban.com/news/detail-620782.html
class Solution {
public:
string robotWithString(string s) {
int n = s.size();
string res;
stack<char> t;
// 用一个数组来记录索引i到结尾的最小元素
vector<char> min_i2end(n);
min_i2end[n - 1] = s[n - 1];
for (int i = n - 2; i >= 0; --i) {
min_i2end[i] = min(min_i2end[i + 1], s[i]);
}
for (int i = 0; i < n; ++i) {
// 如果后续没有更小的值了,那么就将栈顶元素写入结果
while (!t.empty() && t.top() <= min_i2end[i]){
res.push_back(t.top());
t.pop();
}
// 否则入栈
t.push(s[i]);
}
// 后处理
while (!t.empty()) {
res.push_back(t.top());
t.pop();
}
return res;
}
};
到了这里,关于leetcode2434. 使用机器人打印字典序最小的字符串 出栈顺序 贪心+栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!