概述
分析
- 题目类型仍然可以看作是删除数组元素,依然可以考虑双指针
- 需要对每个数组单独处理,所以可以将双指针删除元素的操作提取成一个函数,完成后,比较删除后两数组是否相等即可
思路
双指针实现思路?
见代码部分
代码
class Solution {
public:
int deal_string(string &s, int slow_index = 0, int fast_index = 0) {
for(; fast_index < s.size(); ++fast_index) {
if (s[fast_index] != '#') // 如果s[fast_index]不为#,则该元素合法,加到合法序列后一个位置,即slow_index的位置
s[slow_index++] = s[fast_index];
else // 相对于之前的几类题目,多了一步
if(--slow_index < 0) slow_index = 0; // 这里很关键
}
return slow_index;
}
bool backspaceCompare(string s, string t) {
int length1 = deal_string(s);
int length2 = deal_string(t);
if (length1 != length2) return false;
for (int i = 0; i < length2; ++i) {
if (s[i] != t[i]) return false;
}
return true;
}
};
考虑
-
slow_index/fast_index
初值问题?-
一般来说,
slow_index=0
指向数组起始位置,此时我们就要解释slow_index
的意思;对于本题,数组第一个元素不一定就不是#,所以
slow_index
是要操作的位置,所以意思应该为 【合法序列的后一个位置】 -
同样,因为
nums[0]
也是需要判断的,所以fast_index
也要从0开始判断
-
-
if(--slow_index < 0) slow_index = 0;
- 首先,根据题目,如果
s[fast_index]=='#'
,slow_index本来就需要向前移动,以模拟删除操作; - 但是,当slow_index=0时,如果还要删除,实际上是多余的操作并且会引起之后加入合法元素的错误,所以我们需要保证slow_index>=0才行
- 首先,根据题目,如果