题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255
题意:中文题诶~
思路:对于当前字符 s[i],若其不在栈中,将其与栈顶元素比较,若 s.top() > s[i],则退栈至s.top() < s[i] 或者 i 后面不存在字符 s.top(),再将 s[i] 入栈;
先预处理一个 tag[i][j] 子串 s[i....n-1]有多少字符 j ;
代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int MAXN = 1e5+10; 7 int tag[MAXN][26], vis[26], indx = 0; 8 char q[30]; 9 10 int main(void){ 11 string s; 12 cin >> s; 13 for(int i = s.size() - 1; i >= 0; i--){ 14 for(int j = 0; j < 26; j++){ 15 if(j == s[i] - 'a') tag[i][j] = tag[i + 1][j] + 1; 16 else tag[i][j] = tag[i + 1][j]; 17 } 18 } 19 for(int i = 0; i < s.size(); i++){ 20 if(!vis[s[i] - 'a']){ 21 while(indx > 0){ 22 int cnt = q[indx] - 'a'; 23 if(cnt < s[i] - 'a' || tag[i + 1][cnt] == 0) break; 24 --indx; 25 vis[cnt] = 0; 26 } 27 q[++indx] = s[i]; 28 vis[s[i] - 'a'] = 1; 29 } 30 } 31 for(int i = 1; i <= indx; i++){ 32 printf("%c", q[i]); 33 } 34 puts(""); 35 return 0; 36 }