题目描述
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
示例:
输入:S = “a##c”, T = “##a#c”
输出:true
解释:S 和 T 都会变成 “c”。
考虑如何使得空间复杂度为O(1)
解题思路
法一: 直观地,遍历两个字符串,按照退格的限制生成各自最终的字符串并比较,时间复杂度O(M + N)
,空间复杂度O(M + N)
法二: 双指针法。在原字符串上从后向前遍历,遇到#
就跳过,并且记录下#
的数量;如果遇到了字符且#
的数量不为0,就跳过该字符;如果遇到字符且#
数量为0,就进入下一步。
对两个字符串都进行这样的操作,就得到了各自有效的字符,然后进行比较
法二是题解中的方法,它主要是达到了题目中空间复杂度为O(1)
的要求,这里就直接放一下题解中的代码,好好品一品
class Solution {
public boolean backspaceCompare(String S, String T) {
int i = S.length() - 1, j = T.length() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) { // While there may be chars in build(S) or build (T)
while (i >= 0) { // Find position of next possible char in build(S)
if (S.charAt(i) == '#') {skipS++; i--;}
else if (skipS > 0) {skipS--; i--;}
else break;
}
while (j >= 0) { // Find position of next possible char in build(T)
if (T.charAt(j) == '#') {skipT++; j--;}
else if (skipT > 0) {skipT--; j--;}
else break;
}
// If two actual characters are different
if (i >= 0 && j >= 0 && S.charAt(i) != T.charAt(j))
return false;
// If expecting to compare char vs nothing
// pay attention here
if ((i >= 0) != (j >= 0))
return false;
i--; j--;
}
return true;
}
}