leetcode1047

题目:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/

思路一:双指针法

分析:
题目要求删掉相邻的重复选项,也就是判断相邻的两个字母相不相等即可,如果相等,就把这相邻的字母删掉,不相等就往后接着判断
步骤:
1、 求出字符串的长度
2、令字符串的下标为1,
3、字符串下标不超过字符串的长度,就执行循环体
4、让当前字符和前一个字符相比,等于,就删掉这两个元素,同时,下标要减1,判断如果下标为0,就让下标为1;长度减掉2;否则,就让下标加一;
5、执行结束后 ,,返回字符串
注意:这种方式是在原来的字符串上进行操作,并没有新开辟空间

string removeDuplicates(string S) {


    int len = S.size();
    int i = 1;
    while (i < len)
    {
        if (S[i] == S[i - 1])
        {
            S.erase(S.begin() + i - 1, S.begin() + i + 1);
            i -= 1;
            if (i == 0)
                i = 1;
            len -= 2;
            
        }
        else
        i++;
    }
    return S;
}

思路二:队列模拟

分析:选用双端队列,让符合条件的字符进队列,然后再从队尾 弹出;如果字符串和队列的尾元素不相等,就入队列,否则就弹出队尾元素并且下标向后移一位
步骤:
1、定义一个双端队列,将字符串的0号元素进队列
2、在字符串不为‘\0’的情况下执行循环体
3、先判断队列是否为空,不为空就将队尾元素弹出,如果当前元素和队尾元素相等,就加那个队尾元素弹出,否则就将元素进队列;如果为空,就将当前元素压入队列4、字符串下标后移一位
5、定义一个新字符串,将队列元素从队首弹出,弹出的元素让字符串去接

string removeDuplicates(string S)
{
       deque<char>que;
       int i = 0;
       que.push_back(S[i]);
       i = 1;
       while (S[i] != '\0')
       {
              if (!que.empty())
              {
                     char temp = que.back();
                     if (S[i] == temp)
                     {
                           que.pop_back();
                     }
                     else
                           que.push_back(S[i]);
              }
         else
              que.push_back(S[i]);
              i++;
              
       }
       string t;
       while (!que.empty())
       {
              char tmp = que.front();
              que.pop_front();
              t += tmp;
       }
       return t;
}

思路三:用栈模拟

  string removeDuplicates(string S)
{
    stack<char>stk;
    for(char ch:S)
    {
        if(stk.empty()||ch!=stk.top())
        {
            stk.push(ch);
        }
        else
        {
            stk.pop();
        }
    }
    string result="";
    while (!stk.empty())
    {
        result +=stk.top();
        stk.pop();
    }
    reverse(result.begin(),result.end());
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值