学习日记【LeetCode】 844. 比较含退格的字符串

【LeetCode】844. 比较含退格的字符串

一、题目内容

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 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 = “#a#c”
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:

输入:S = “a#c”, T = “b”
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

二、考察内容

顺序栈、双指针

三、解题思路

思路一:使用顺序栈
创建一个栈,将不是#的字符入栈,当遇到#就将栈顶回退一个。当栈顶本身就在一开始的地方时,就不用回退了。当然,由于考虑到最后是比较两个字符串数组内部元素,考虑到字符串的特点:以‘\0’为结束标志。所以我们将最后一个元素的下一位定义为’\0’,结束这个顺序栈的赋值。因而考虑到最坏情况,我们需要将这个顺序栈的大小定为需要处理的字符数组的大小再加一。

思路二:双指针
由于输入的#会掩盖掉前的字母字符,所以但不会影响后面的字符,所以我们不妨将数组反过来看,反过来逐一比较,遇到几个#记下来,以此明确可以跳过多少个字母,当两个数组都“跳完”了,我们就比较当前两个指针指着的字母,一旦不同就false,true就继续上面的步骤。直到比较的数组为空。当然,当两个需要比较的数组不能同时为空,肯定是false的。

单独地去看数组中的各个元素,不像思路一,思路一是一个整体地进行比较。由于只要有一个不同,两者就可以结束比较,后面的甚至可以不用看了,所以这道题微观地看待问题,使用双指针,效率会更高。

四、作答

我的代码

char* buildStack(char* str)
{
	char* s = malloc((strlen(str)+1)*sizeof(char));
	int length = 0;
	for (int i = 0; i < strlen(str); i++)
	{
		if (str[i] != '#')
		{
			s[length] = str[i];
			length++;
		}
		if (length > 0 && str[i] == '#')
			length--;
	}
	s[length] = '\0';
	return s;
}

bool backspaceCompare(char * S, char * T){
    return strcmp( buildStack(S), buildStack(T)) == 0;
}

错处与修改

五、官方或网友解答

思路一:

char* build(char* str) {
    int n = strlen(str), len = 0;
    char* ret = malloc(sizeof(char) * (n + 1));
    for (int i = 0; i < n; i++) {
        if (str[i] != '#') {
            ret[len++] = str[i];
        } else if (len > 0) {
            len--;
        }
    }
    ret[len] = '\0';
    return ret;
}

bool backspaceCompare(char* S, char* T) {
    return strcmp(build(S), build(T)) == 0;
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/backspace-string-compare/solution/bi-jiao-han-tui-ge-de-zi-fu-chuan-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

思路二:

bool backspaceCompare(char* S, char* T) {
    int i = strlen(S) - 1, j = strlen(T) - 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.com/problems/backspace-string-compare/solution/bi-jiao-han-tui-ge-de-zi-fu-chuan-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

六、备注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值