题目链接:CSL 的字符串
题目描述:
给定一个字符串,只含有可打印字符,通过删除若干字符得到新字符串,新字符串必须满足两个条件:
输入描述:
仅一行,有一个只含有可打印字符的字符串 s。
|s|≤10^5
输出描述:
在一行输出字典序最小的新字符串。
示例1
输入
bab
输出
ab
示例2
输入
baca
输出
bac
备注:
ASCII字符集包含 94 个可打印字符(0x21 - 0x7E),不包含空格。
思路:引用自()
使用栈进行模拟,如果当前字符已经在栈中,则跳过(保证了每个字符只存一次),否则进行如下操作:如果当前字符比栈顶元素小并且栈顶元素在之后的序列中仍有剩余,就弹出栈顶元素,持续这个过程直到栈顶元素比当前元素小或者栈顶元素没有剩余,然后把当前字符放入栈中(保证了所有字符都会存入栈中)
/*手写栈:*/
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{ios::sync_with_stdio(false);string s;string a;a[0]=-128;ll flag[200]={},book[200]={};//这一句放在全局会出现段错误,原因暂时不明cin>>s;ll top=0,len;len=s.size();for(ll i=0;i<len;i++){flag[s[i]]++;//记录字符串s中每个字符出现的个数}for(ll i=0;i<len;i++){flag[s[i]]--;//看了思路后,起初写的时候没有这句,而是下面注释掉的那句flag[a[top]]--,所以一直WAif(book[s[i]]==0){book[s[i]]=1;//标记该字符已在栈中while(s[i]<a[top]&&flag[a[top]]>0&&top!=0){book[a[top]]=0;top--;}a[++top]=s[i];//flag[a[top]]--;}}for(ll j=1;j<=top;j++){cout<<a[j];}cout<<endl;return 0;
}
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{ios::sync_with_stdio(false);string s;string a;ll flag[200]={};ll book[200]={};cin>>s;ll top=0,len;len=s.size();for(ll i=0;i<len;i++){flag[s[i]]++;}a[top]=s[0];book[s[0]]=1;flag[s[0]]--;for(ll i=1;i<len;i++){flag[s[i]]--;//一直WA,用这句代替下面注释的三句就AC了if(s[i]<a[top]&&book[s[i]]==0){if(flag[a[top]]>=1){while(flag[a[top]]>=1&&s[i]<a[top]){book[a[top]]=0;top--;}a[++top]=s[i];book[a[top]]=1;//flag[a[top]]--;}else{a[++top]=s[i];book[s[i]]=1;//flag[a[top]]--;}}else if(s[i]>=a[top]&&book[s[i]]==0){a[++top]=s[i];book[a[top]]=1;//flag[a[top]]--;}}for(ll j=0;j<=top;j++){cout<<a[j];}cout<<endl;return 0;
}
/*用C++STL库的栈:*/
#include <iostream>
#include <stack>
using namespace std;
typedef long long ll;
const int M=1e5+7;
stack <char> st;
void f()
{pty()){return ;}char cp();st.pop();f();cout<<c;
}
int main()
{string s;ll i,j,flag[200]={0},len;cin>>s;len=s.size();for(i=0;i<len;i++){flag[s[i]]++;//标记接下来的字符出现的个数}char vis[200]={0};//标记字符是否在栈中for(i=0;i<len;i++){flag[s[i]]--;if(vis[s[i]]==0){vis[s[i]]=1;while(!st.empty()&&s[i]&p()&&p()]!=0){p()]=0;st.pop();}st.push(s[i]);}}//从下往上输出f();cout<<endl;return 0;
}
/*最后应该输出是从栈底往栈顶输出,可用递归*/
本文发布于:2024-01-30 14:02:01,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659452320516.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |