LeetCode [1047]
题目描述
- 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。
之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
解法
[官方解法]需要注意C++中,string自带容器适配器stack功能,
stack的只能访问栈顶元素,压栈后,栈底无法访问,只有pop_back出栈后,才能访问。
string Solution::removeDuplicates(string s)
{
string stack;
for( char c : s )
{
if( !stack.empty() && stack.back() == c )
stack.pop_back();
else
stack.push_back(c);
}
return stack;
}
[暴力解法] 我自己的解法,但是运行时限不过,这种方式的时间复杂度很高。
string Solution::removeDuplicates(string s)
{
string stmp(s);
int i = 0;
while(1){
bool jumpend = false;
int length = stmp.length()-1;
if(i >= length)
i = 0;
if( stmp.at(i) == stmp.at(i+1) && i < length)
{
stmp.erase(i,2); //若相邻为同,则删除
}
++i;
// cout << "stmp: " << stmp << endl;
if(stmp.length() <= 0)
return "";
for (size_t j = 0; j < stmp.length()-1; j++)
{
if( stmp.at(j) == stmp.at(j+1) ){
jumpend = true;
break;
}
}
if(!jumpend)
return stmp;
}
}
能力有限:提交超时