【力扣】【算法基础】844. 比较含退格的字符串

  1. 比较含退格的字符串

力扣844

给定 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值