链接:
来源:牛客网
在一行输出字典序最小的新字符串。示例1
bab
ab示例2
baca
bac
ASCII字符集包含 94 个可打印字符(0x21 - 0x7E),不包含空格。
题意:按题目所说的两个要求找就行了。
思路:先记录出现字符的个数,然后对整个字符串进行模拟:
如果这个字符被用过了则跳过;
如果没用过的话,跟栈顶字符比较,如果比栈顶字符的ASCII码小,且栈顶的字符没被用完,就把栈顶弹出,把栈顶字符记为没用过。注意如果栈顶用完了不能弹出,这样保证了所有字符最后都会在栈中。
找到不能找为止,(用while循环),然后把当前字符入栈,标记已经用过。
因为当前字符会跟栈里面字符进行比较,保证了当前栈内保存的是字典序最小的解,又因为如果栈顶被用完了不能弹出,保证了所有字符都会被入栈。
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define INF 2000000000 int vis[1001],use[1001]; stack<char>st; int main() {string s;getline(cin,s);memset(vis,0,sizeof(vis));memset(use,0,sizeof(use));for(int i = 0 ; i < (int)s.length() ; i++)use[s[i]]++;st.push(s[0]);vis[s[0]] = 1;--use[s[0]];for(int i = 1 ; i < (int)s.length() ; i++){use[s[i]]--;if(!vis[s[i]]){while(!st.empty() && st.top() > s[i] && p()]>0){p()]=0;st.pop();}st.push(s[i]);vis[s[i]] = 1;}}string p = "";while(!st.empty()){p += st.top();st.pop();}for(int i = (int)p.length()-1; i >= 0 ; i--){printf("%c",p[i]);}puts(""); } /* 31243!464! 31242464 4321 1121 1356324356 */
转载于:.html
本文发布于:2024-01-30 14:01:51,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659451520515.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |