提交 76e29cac 编写于 作者: cosmicing's avatar cosmicing

上传新文件

上级 fbf8cd45
#include<iostream>
#include<string>
#include<string.h>
#include<stack>
#include<assert.h>
using namespace std;
class Solution {
public:
string removeDuplicateLetters(string s) {
string str;
for(int i = 0;i < s.length(); i++) {
if(str.empty()) { //1)如果为空或者s[i]大于栈顶元素,应该压栈;空栈的时候一定压栈,但是大于栈顶元素时,还要判断栈中是否有重复元素,有重复则不压栈=>进入3)步处理;
str.push_back(s[i]);
} else { //c++: s.find(str.back(), i) != -1,栈顶字符后面还有相同的。
while(!str.empty() && s[i] < str.back() && s.find(str.back(), i) != -1) { //从指定的索引 i 处开始,返回第一次出现的指定子字符串在此字符串中的索引
str.pop_back(); //2)~1=>如果s[i]小于栈顶元素,且在s[i]的后面有与栈顶元素stk.top()相同的字符,弹出堆栈的栈顶元素.继续循环
} //2)~2=>查找s[i]的后面有与栈顶元素stk.top()相同的字符,退出while循环说明没有找到相同的,就需要进行压栈s[i].
if(str.find(s[i], 0) == -1){ //3)~1:对于s[i]大于栈顶元素 + ~2:虽然s[i]<stk.top && 但后面无重复=>都是需要压栈的s[i]元素,需要判断栈中是否有相同的字符?有不压栈,没有则压栈.
str.push_back(s[i]);
}
}
}
cout << "str = " << str << endl;
return str;
}
};
string stringToString(string input) {
assert(input.length() >= 2);
string result;
for (int i = 1; i < input.length() -1; i++) {
char currentChar = input[i];
if (input[i] == '\\') {
char nextChar = input[i+1];
switch (nextChar) {
case '\"': result.push_back('\"'); break;
case '/' : result.push_back('/'); break;
case '\\': result.push_back('\\'); break;
case 'b' : result.push_back('\b'); break;
case 'f' : result.push_back('\f'); break;
case 'r' : result.push_back('\r'); break;
case 'n' : result.push_back('\n'); break;
case 't' : result.push_back('\t'); break;
default: break;
}
i++;
} else {
result.push_back(currentChar);
}
}
return result;
}
string boolToString(bool input) {
return input ? "True" : "False";
}
int main() {
string line;
while (getline(cin, line)) {
string s = stringToString(line);
string ret = Solution().removeDuplicateLetters(s);
string out = (ret);
cout << out << endl;
}
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册