题目:
给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
考虑到如果要实现O(n)的时间复杂度以及O(1)的空间复杂度,因此,双指针法为本题的最优解法。
这个题初拿到手较难理解,很容易落入传统从前向后遍历思想的窠臼中,而这也恰恰导致难以明白“退格”的实现过程。
但如果换个思路,倒序遍历,遇到‘#’跳过,那问题就会容易理解的多。
因此,我们首先将该问题拆解成小问题,即遇到“#”跳过,以及比较指定下标的字符是否相等两个小问题。
故:
1.首先设置遍历起点,也就是字符串末尾;
2. 设置计数器,用于统计有几个“#”;
3.考虑两层循环——内层循环用于比较当前有效下标是否相等,外层循环用于找到下一个有效下标
4.在内部循环中,我们每遇到一个“#”,就将计数器 +1 ;当下标字符不为‘#’但是计数器不为0的时候,就跳过,然后计数器减1;
5.在判断时,仅在两个下标都为有效下标时才比较是否相等;如果有一个已经超出边界则直接返回假。
按上述流程,最终代码如下:
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
while (i >= 0 || j >= 0) {
int skips = 0, skipt = 0;
while (i >= 0) {
if (s[i] == '#') {
skips++;
i--;
} else if (skips > 0) {
i--;
skips--;
} else
break;
}
while (j >= 0) {
if (t[j] == '#') {
skipt++;
j--;
} else if (skipt > 0) {
j--;
skipt--;
} else {
break;
}
}
if (i >= 0 && j >= 0) {
if (s[i] != t[j]) {
return false;
}
}else if (i >= 0 || j >= 0) {
return false;
}
i--;
j--;
}
return true;
}
};