LeetCode [1047]

题目描述

  1. 删除字符串中的所有相邻重复项
    给出由小写字母组成的字符串 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;
    }
}

能力有限:提交超时

stack容器的插图

string的常用函数解析

http://www.cplusplus.com/reference/string/string/

posted @ 2021-08-05 13:59  方罗良  阅读(37)  评论(0)    收藏  举报