题目: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;
}