给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。请用暴力法,语言c++,并指出代码的时间复杂度和空间复杂度
时间: 2024-02-21 12:00:30 浏览: 127
去掉重复的字符串及在第一个字符串中删除在第二个字符串中出现的字符
好的,以下是代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
string removeDuplicateLetters(string s) {
int cnt[26] = {0}; // 统计每个字符出现的次数
bool vis[26] = {false}; // 标记每个字符是否在栈中
char stack[1001]; // 模拟栈
int top = -1; // 栈顶指针
for (int i = 0; i < s.size(); i++) {
cnt[s[i] - 'a']++;
}
for (int i = 0; i < s.size(); i++) {
int idx = s[i] - 'a';
if (!vis[idx]) {
while (top >= 0 && stack[top] > s[i] && cnt[stack[top] - 'a'] > 0) {
vis[stack[top] - 'a'] = false;
top--;
}
stack[++top] = s[i];
vis[idx] = true;
}
cnt[idx]--;
}
string res = "";
for (int i = 0; i <= top; i++) {
res += stack[i];
}
return res;
}
int main() {
string s;
cin >> s;
cout << removeDuplicateLetters(s) << endl;
return 0;
}
```
时间复杂度:$O(n^2)$,由于内层while循环的时间复杂度是$O(n)$,而外层for循环需要执行n次,所以总的时间复杂度是$O(n^2)$。
空间复杂度:$O(n)$,由于栈的大小最大为字符串长度n,所以空间复杂度为$O(n)$。
阅读全文