一、题目
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S
仅由小写英文字母组成。
二、题解思路
- 题解思路:遍历字符串,如果遇到相邻字符串相等,则删除这两个字符串,然后原本索引i退后一位(如果是0位,则不需要退位),索引j变成其下一位,如果相邻的字符不等,则索引i到j的位置,j索引指向下一个。其中删除两个相邻元素使用string中的erase进行操作。
三、代码实现
- C++代码实现
class Solution {
public:
string removeDuplicates(string S)
{
int i = 0; //相邻两个的第一个索引位
for(int j = 1;j<S.size();) //相邻两个的第二个索引位
{
if(S[i] == S[j]) //相邻元素相等
{
S.erase(i,2); //删除相邻的两个元素
if(i != 0) //如果i不是S中的第0位,则需要退回一位
i = i-1;
j = i+1; //j为i的下一位
}
else //相邻元素不等
{
i = j; //i指向j的位置
j++; //j指向下一位
}
}
return S;
}
};