- 比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。
示例 2:
输入:s = “ab##”, t = “c#d#”
输出:true
解释:s 和 t 都会变成 “”。
示例 3:
输入:s = “a#c”, t = “b”
输出:false
解释:s 会变成 “c”,但 t 仍然是 “b”。
提示:
1 <= s.length, t.length <= 200
s 和 t 只含有小写字母以及字符 ‘#’
进阶:
你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
解题思路
从后往前比,遇到#号指针下移,一直找到可以比较的数,发现不同就返回false
自己写的代码不对.
第一个错误:
对于a#a#这样的形式没考虑,我的思路是发现#号,计数器加一,指针向下移,然后跳过对应数量的字母,然后没考虑跳过后可能还是#号。在这里应该需要重复,直到出现·aa#这样的才可以去比较,所以需要再加一个循环。
还要注意边界问题,指针指到0和-1的情况,不然容易出现野指针!
错误代码
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
int t1 = 0, t2 = 0;
while (i >= 0 || j >=0) {
while (s[i] == '#') {
t1++;
i--;
}
while (t[j] == '#') {
t2++;
j--;
}
if (t1 || t2) {
while (t1 && i>=0) {
t1--;
i--;
}
while (t2 && j>=0) {
t2--;
j--;
}
}
if (s[i] != t[j]) {
return false;
}
i--;j--;
}
return true;
}
修改后发现了第二个错误:
失败样例:
“bxj##tw”
“bxo#j##tw”
因为我是把查#和删#写成了顺序的结构,因此在第二个字符串中,第一个#被后面的#给删掉了(唉),所以不可以,还是得一个一个比。
还有一点很重要的注意:在写while判断是#号计数的循环条件时,先判断下标i,再判断s[i],不然下标是负数!!!(&&的判断顺序)
错误代码
while (i >= 0 || j >=0) {
while(i>=0){
if(s[i]!='#') break;//不是#,可以比较
while ( i>=0 && s[i] == '#' ) {//是#号,计数并跳过#
t1++;
i--;
}
while (t1 && i>=0) {//跳过被#删除的
t1--;
i--;
}
}
修改后代码:(总算过了唉)
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
int t1 = 0, t2 = 0;
while (i >= 0 || j >=0) {
while(i>=0){
if(s[i]=='#'){
t1++;i--;
}
else if (t1) {
t1--;
i--;
}else break;
}
//此时跳出循环的要么是可以比较的数,要么是删到边界不能比较
while(j>=0){
if(t[j]=='#'){
t2++;j--;
}
else if (t2) {
t2--;
j--;
}else break;
}
// cout<<"i= "<<i<<" j="<<j<<endl;
if(i<0 && j<0)//都小于0,都删到边界不能比了
return true;
else if(i>=0 && j>=0){
if (s[i] != t[j]) return false;
else i--;j--;
}//都不小于0
else
return false;
}
return true;
}
题解:
从后往前比较
bool 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 (i >= 0) {
if (S[i] == '#') {
skipS++, i--;
} else if (skipS > 0) {
skipS--, i--;
} else {
break;
}
}
while (j >= 0) {
if (T[j] == '#') {
skipT++, j--;
} else if (skipT > 0) {
skipT--, 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;
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/backspace-string-compare/solution/bi-jiao-han-tui-ge-de-zi-fu-chuan-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。