#include <iostream> #include <algorithm> #include "Stack.hpp" #include "Vector.hpp" #include "String.hpp" using namespace std; class StringHandler { public: StringHandler(); string removeDuplicateLetters(string s); private: vector<int> count; vector<bool> inStack; Stack<char> st; }; StringHandler::StringHandler() : count(26, 0), inStack(26, false) {} string StringHandler::removeDuplicateLetters(string s) { for (char c : s) { count[c - 'a']++; } for (char c : s) { count[c - 'a']--; if (inStack[c - 'a']) { continue; } while (!st.empty() && st.top() > c && count[st.top() - 'a'] > 0) { inStack[st.top() - 'a'] = false; st.pop(); } st.push(c); inStack[c - 'a'] = true; } string ans = ""; while (!st.empty()) { ans += st.top(); st.pop(); } reverse(ans.begin(), ans.end()); return ans; } int main() { StringHandler handler; string s; cout<<"请输入字符串:"; cin>>s; cout <<endl<< handler.removeDuplicateLetters(s) << endl; return 0; }解释每一行代码
时间: 2023-12-03 15:47:01 浏览: 72
```c++
#include <iostream>
#include <algorithm>
#include "Stack.hpp"
#include "Vector.hpp"
#include "String.hpp"
using namespace std;
class StringHandler {
public:
StringHandler(); // 默认构造函数
string removeDuplicateLetters(string s); // 去除字符串中重复的字母
private:
vector<int> count; // 计数数组,记录每个字母出现的次数
vector<bool> inStack; // 标记数组,标记某个字母是否在栈中
Stack<char> st; // 存储待输出的字母的栈
};
StringHandler::StringHandler() : count(26, 0), inStack(26, false) {} // 默认构造函数的实现,初始化计数数组和标记数组
string StringHandler::removeDuplicateLetters(string s) {
for (char c : s) { // 遍历字符串,统计每个字母出现的次数
count[c - 'a']++;
}
for (char c : s) { // 再次遍历字符串,将每个字母加入栈中
count[c - 'a']--; // 由于当前字母已经被遍历到,所以它的出现次数要减一
if (inStack[c - 'a']) { // 如果当前字母已经在栈中,说明已经处理过了,直接跳过
continue;
}
while (!st.empty() && st.top() > c && count[st.top() - 'a'] > 0) { // 如果栈不为空,并且栈顶字母比当前字母大,并且栈顶字母在后面还会出现,就将栈顶字母弹出
inStack[st.top() - 'a'] = false;
st.pop();
}
st.push(c); // 将当前字母入栈
inStack[c - 'a'] = true; // 标记当前字母已经在栈中
}
string ans = ""; // 存储最终的结果
while (!st.empty()) { // 将栈中的元素依次出栈,拼接成字符串
ans += st.top();
st.pop();
}
reverse(ans.begin(), ans.end()); // 因为是从栈底到栈顶输出的,所以需要将结果翻转一下
return ans; // 返回结果
}
int main() {
StringHandler handler; // 创建 StringHandler 对象
string s;
cout << "请输入字符串:";
cin >> s;
cout << endl << handler.removeDuplicateLetters(s) << endl; // 输出去重后的字符串
return 0;
}
```
这段代码实现了去除字符串中重复的字母,具体实现可以参考代码中的注释。其中用到了自定义的 Stack、Vector 和 String 类,这些类的实现可以在代码库中找到。
阅读全文