力扣844题(栈,双指针(难))

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

  1. 拿到题目时并不清楚如何用简单的方法处理退格,既需要删去#号,又需要再往前再删一个元素。查看题解使用的第一种方法是使用栈去对字符串进行重构,然后再进行比较。重构的过程是这样的:遇到不是#号的元素就入栈,遇到#号就弹出栈顶元素。
char* rebuild(char *str){
    int oldLen = strlen(str), newLen = 0;//newLen相当于栈顶指针
    //存储新字符串的栈
    char *newStr = (char*)malloc(sizeof(char) * (oldLen + 1));
    for (int i = 0; i < oldLen; i ++) {
        if (str[i] != '#') 
        	//入栈一个元素
            newStr[newLen ++] = str[i];
        else if (newLen > 0)
        	//相当于把栈顶元素出栈
            newLen --;
    }
    newStr[newLen] = '\0';
    return newStr;

}

bool backspaceCompare(char * s, char * t){
    return strcmp(rebuild(s),rebuild(t)) == 0;
}
  1. 第二种解法是双指针法,跟之前使用的双指针法不太一样。由于#号只对左边的字符有影响,所以用两个指针分别指向两个字符串的末尾,逆向遍历,并且记录下遇到的#号个数,当遇到某个字符时且遇到#号的数量为0时,说明该字符会留下来,对留下来的字符一一进行比对,如果都能比对成功的话就说明退格后的字符串是一样的。
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] == '#') { //记录加1,指针前移
                skipS++, i--;
            } else if (skipS > 0) { //记录减1,指针前移
                skipS--, i--;
            } else { //当前字符不为#号时且记录数为0时遍历要停止
                break; 
            }
        }
        while (j >= 0) {
            if (T[j] == '#') { //记录加1,指针前移
                skipT++, j--;
            } else if (skipT > 0) { //记录减1,指针前移
                skipT--, j--;
            } else { //当前字符不为#号时且记录数为0时遍历要停止
                break;
            }
        }
        if (i >= 0 && j >= 0) { //当两个指针都不小于0时才需要进行比对字符
            if (S[i] != T[j]) { 
                return false;
            }
        } else { 
            if (i >= 0 || j >= 0) {
                return false;
            }
        }
        i--, j--;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值