编写程序,删除输入的字符串中的重复字符,使得余下的字符串最小(按字符的字典排列比较规则),且余下的字符在原来字符串的相对位置保持不变。 说明:1)字符串中均为小写字母;2)字符串长度在9998以内。
C语言AC代码,自己复制
主要思路:
创建一个栈,先计算一下每个字母的出现次数,然后往里面压入字母,栈顶字母比要压入的字母大并且栈顶字母后续还出现过,就把栈顶字母弹出,否则保留,单调栈的思想
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAXN 9998
bool contains(char stack[], int top, char c) {
for (int i = 0; i <= top; i++) {
if (stack[i] == c) {
return true;
}
}
return false;
}
void removeDuplicate(char s[]) {
int n = strlen(s);
int count[26] = {0};
char stack[MAXN];
int top = -1;
for (int i = 0; i < n; i++) {
count[s[i] - 'a']++;
}
for (int i = 0; i < n; i++) {
char c = s[i];
count[c - 'a']--;
if (contains(stack, top, c)) {
continue;
}
while (top >= 0 && stack[top] > c && count[stack[top] - 'a'] > 0) {
top--;
}
stack[++top] = c;
}
for (int i = 0; i <= top; i++) {
printf("%c", stack[i]);
}
printf("\n");
}
int main() {
char s[MAXN];
scanf("%s", s);
removeDuplicate(s);
return 0;
}