题目链接:力扣 2434. 使用机器人打印字典序最小的字符串
题目大意
给出一个字符串s和一个空字符串t,会不断的将s的头部字符取出放入t的末尾和将t的末尾字符取出打印出来。要求让打印的字符串字典序最小。
题意解析
如果不看题目的要求限制。我们可以将其看作一个将s的字符入栈再出栈的过程。
因此,如果加上字典顺序最小的限制,那么对于每一个栈顶元素:
- 对于已经放入栈的栈顶字符 m ,如果 s 剩下的字符中有比 m 字典序更小的字符 n ,那么将 s 的字符不断入栈直到能够将 n 出栈。
- 对于已经放入栈的栈顶字符 m ,如果 s 剩下的字符中没有比 m 字典序更小的字符 n ,那么我们就可以直接将 m 出栈。
代码(c++)
class Solution {
public:
string robotWithString(string s)
{
int n=s.size();
vector<char> m(n);
string ans;
m[n-1]=s[n-1];
for(int i=n-2;i>=0;i--) m[i]=min(m[i+1],s[i]); //后缀最小,简化寻找后面是否有更小字符的操作
stack<char> st;
for(int i=0;i<n;i++)
{
while(st.size()&&st.top()<=m[i]) ans.push_back(st.top()),st.pop(); //如果当前栈顶元素是字典序最小的,那么就出栈
st.push(s[i]);
}
while(st.size()) ans.push_back(st.top()),st.pop(); //将栈中剩下元素入栈
return ans;
}
};