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; }解释以上代码的算法和算法思想以及思路
时间: 2023-12-06 19:41:53 浏览: 65
这段代码实现了一个移除字符串中重复字符的算法,其算法思想是使用栈来保存当前未重复的字符,并记录每个字符是否在栈中以及每个字符出现的次数。
具体的算法流程如下:
1. 遍历字符串s,统计每个字符出现的次数,存储在count数组中;
2. 再次遍历字符串s,对于每个字符,将其出现次数减1;
3. 如果当前字符已经在栈中,则直接跳过;
4. 否则,循环判断栈顶元素是否大于当前字符且栈顶元素后面还有相同的字符,如果满足条件,则弹出栈顶元素,并将其标记为不在栈中;
5. 将当前字符压入栈中,并将其标记为在栈中;
6. 最后将栈中的字符倒序拼接成字符串,得到的就是移除重复字符后的结果。
总体来说,这是一种贪心算法,每次都选择当前最优解,即选择当前字符并尽可能地移除后面相同的字符,从而得到全局最优解。
相关问题
#ifndef STRINGHANDLER_H #define STRINGHANDLER_H #include <string> #include <vector> #include <stack> #include <algorithm> 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; } #endif // STRINGHANDLER_H解释每一行代码
1. `#ifndef STRINGHANDLER_H` - 如果未定义宏`STRINGHANDLER_H`,则进入条件编译。
2. `#define STRINGHANDLER_H` - 定义宏`STRINGHANDLER_H`,保证头文件只被编译一次。
3. `#include <string>` - 包含头文件`string`,提供字符串操作的功能。
4. `#include <vector>` - 包含头文件`vector`,提供向量操作的功能。
5. `#include <stack>` - 包含头文件`stack`,提供栈操作的功能。
6. `#include <algorithm>` - 包含头文件`algorithm`,提供算法操作的功能。
7. `using namespace std;` - 引入命名空间`std`。
8. `class StringHandler {` - 定义类`StringHandler`。
9. `public:` - 公共访问权限。
10. `StringHandler();` - 默认构造函数。
11. `string removeDuplicateLetters(string s);` - 定义函数`removeDuplicateLetters`,输入字符串`s`,输出去除重复字母后的字符串。
12. `private:` - 私有访问权限。
13. `vector<int> count;` - 定义向量`count`,存储每个字母出现的次数。
14. `vector<bool> inStack;` - 定义向量`inStack`,表示每个字母是否在栈中。
15. `stack<char> st;` - 定义栈`st`,存储字符。
16. `StringHandler::StringHandler() : count(26, 0), inStack(26, false) {}` - 类`StringHandler`的默认构造函数,初始化`count`和`inStack`向量。
17. `string StringHandler::removeDuplicateLetters(string s) {` - 函数`removeDuplicateLetters`的定义,输入字符串`s`,返回去重后的字符串。
18. `for (char c : s) { count[c - 'a']++; }` - 遍历字符串`s`中的每个字符,统计每个字符出现的次数。
19. `for (char c : s) {` - 再次遍历字符串`s`中的每个字符。
20. `count[c - 'a']--;` - 减少字符`c`的出现次数。
21. `if (inStack[c - 'a']) { continue; }` - 如果字符`c`在栈中,则跳过本次循环。
22. `while (!st.empty() && st.top() > c && count[st.top() - 'a'] > 0) {` - 当栈顶元素大于字符`c`且栈顶元素后面还有相同字符时,弹出栈顶元素。
23. `inStack[st.top() - 'a'] = false;` - 将栈顶元素标记为不在栈中。
24. `st.pop();` - 弹出栈顶元素。
25. `st.push(c);` - 将字符`c`压入栈中。
26. `inStack[c - 'a'] = true;` - 将字符`c`标记为在栈中。
27. `} string ans = "";` - 声明字符串`ans`,用于存储去重后的字符串。
28. `while (!st.empty()) { ans += st.top(); st.pop(); }` - 将栈中元素依次弹出,加入到字符串`ans`中。
29. `reverse(ans.begin(), ans.end());` - 将字符串`ans`反转。
30. `return ans;` - 返回去重后的字符串。
31. `#endif // STRINGHANDLER_H` - 结束条件编译。
为class Solution { public: String removeDuplicateLetters(String s) { Vector<int> count(26); Vector<bool> inStack(26); Stack<char> st; for (std::size_t i = 0; i < s.size(); i++) { count[s[i] - 'a']++; } for (std::size_t i = 0; i < s.size(); i++) { count[s[i] - 'a']--; if (inStack[s[i] - 'a']) { continue; } while (!st.empty() && st.top() > s[i] && count[st.top() - 'a'] > 0) { inStack[st.top() - 'a'] = false; st.pop(); } st.push(s[i]); inStack[s[i] - 'a'] = true; } String ans; while (!st.empty()) { ans.push_back(st.top()); st.pop(); } ans.reverse(); return ans; } };写一个cpp源文件
5.8, 2.6, 4.0, 1.2},
{5.0, 2.3, 3.3, 1.0},
{5.6, 2.7, 4.2, 1抱歉,我无法在此处运行代码,但是我可以为你提供一个完整的C++源代码.3},
{5.7, 3.0, 4.2, 1.2},
{5.7,你可以将其复制到你的本地开发环境中,然后编译和运行它。
```cpp, 2.9, 4.2, 1.3},
{6.2, 2.9, 4
#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
string remove.3, 1.3},
{5.1, 2.5, 3.0, 1.1},
DuplicateLetters(string s) {
vector<int> count(26);
vector<bool> inStack(26);
stack<char> st;
{5.7, 2.8, 4.1, 1.3},
{6.3, 3 for (size_t i = 0; i < s.size(); i++) {
count[s[i] - 'a']++;
.3, 6.0, 2.5},
{5.8, 2.7, 5.1, }
for (size_t i = 0; i < s.size(); i++) {
count[s[i] - 'a']--;
1.9},
{7.1, 3.0, 5.9, 2.1},
{6 if (inStack[s[i] - 'a']) {
continue;
}
while (!st.empty() && st.top() >.3, 2.9, 5.6, 1.8},
{6.5, 3.0, s[i] && count[st.top() - 'a'] > 0) {
inStack[st.top() - 'a'] 5.8, 2.2},
{7.6, 3.0, 6.6, 2.1},
{4.9, 2.5, 4.5, 1.7},
{7.3, = false;
st.pop();
}
st.push(s[i]);
inStack[s[i] - 'a'] = true;
2.9, 6.3, 1.8},
{6.7, 2.5, 5. }
string ans;
while (!st.empty()) {
ans.push_back(st.top());
st.pop();
}
reverse(ans.begin8, 1.8},
{7.2, 3.6, 6.1, 2.5},
(), ans.end());
return ans;
}
};
int main() {
Solution solution;
string s = "bcabc";
string {6.5, 3.2, 5.1, 2.0},
{6.4, 2. ans = solution.removeDuplicateLetters(s);
cout << ans << endl;
return 0;
}
```
在此示例中,7, 5.3, 1.9},
{6.8, 3.0, 5.5, 我们实例化了一个Solution类,并使用removeDuplicateLetters方法从字符串“bcabc”中删除重复字母,将结果打印到控制台。
阅读全文