【牛客】CSL 的字符串 (stack map)

https://ac.nowcoder.com/acm/contest/551/D

这个题怎么说,data用来存储这个字母在字符串中最后一次出现的位置,vis则用来记录该字母是否在栈中。

当栈为空的时候,直接将s[i]放入栈中

如果不为空则需要比较栈顶元素和当前s[i]的那个元素,如果data[s[i]]>i,则说明在位置i之后仍然有相同的字母出现

当前栈顶元素的ASCII码值如果还大于s[i],则需要弹出,vis[s[i]]=0(当之后在出现的那个s[i]的时候就将它放入栈中,保证了字符串的字典序最小),并将当前的s[i]放入栈中。

#include 
#include 
#include 
#include 
#include 

using namespace std;

map data,vis;

int main()
{
	string s;
	cin >> s;
	int i,l = s.length();
	for(i=0;i t;
	for(i=0;ii && t.top()>s[i])
			{
				vis[t.top()] = 0;
				t.pop();
			}
			t.push(s[i]);
		}
		vis[s[i]] = 1;
	}
	string ans;
	while(!t.empty())
	{
		ans += t.top();
		t.pop();
	}
	reverse(ans.begin(),ans.end());
	cout << ans;
	return 0;
}

 

你可能感兴趣的:(OJ)