给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
**注意:**如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。
虽然是一道easy题,但是要做到O(1)的额外空间,就不能使用暴力解法
于是我思考,两个数组都从后往前遍历,当出现'#'字符时,可以记录它出现的次数,从而进行退格操作
第一次提交代码
cpp
class Solution {
public:
bool backspaceCompare(string s, string t) {
int slen=s.size();
int tlen=t.size();
int i=slen-1;
int j=tlen-1;
while(i>=0||j>=0)
{
int n1=0,n2=0;
while(i>=0&&s[i]=='#')
{
n1++;
i--;
}
while(i>=0&&n1>0)
{
if(s[i]=='#') n1++;
else n1--;
i--;
}
while(j>=0&&t[j]=='#')
{
n2++;
j--;
}
while(j>=0&&n2>0)
{
if(t[j]=='#') n2++;
else n2--;
j--;
}
if (i >= 0 && j >= 0) {
if (s[i] != t[j]) {
return false;
}
}
i--;
j--;
}
return true;
}
};
结果是,我没有正确处理一个字符串已经遍历完,而另一个字符串还有字符的情况。当 i
或 j
其中一个小于 0 时,代码没有进行相应的判断,就直接继续循环,可能会导致错误的结果。例如,当 s
已经处理完所有有效字符(i < 0
),而 t
还有有效字符(j >= 0
)时,应该返回 false
,但当前代码没有处理这种情况。
修改后
cpp
class Solution {
public:
bool backspaceCompare(string s, string t) {
int slen=s.size();
int tlen=t.size();
int i=slen-1;
int j=tlen-1;
int n1=0,n2=0;
while(i>=0||j>=0)
{
while(i>=0)
{
if(s[i]=='#') n1++,i--;
else if(n1>0) n1--,i--;
else break;
}
while(j>=0)
{
if(t[j]=='#') n2++,j--;
else if(n2>0) n2--,j--;
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;
}
};