赞
踩
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,给定字符的入栈顺序,求字典序最小的出栈序列。因为是最小的字典序列,所以本题可以使用贪心策略。
对于任意时刻,当前可供选择的字符包括栈顶元素(如果栈非空),没有入栈的元素(当前索引i及之后的全部元素),我们从这两个元素中选取最小值,进行操作
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; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。