⭐算法入门⭐《栈》简单03 —— LeetCode 844. 比较含退格的字符串

🙉饭不食,水不饮,题必须刷🙉

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?先看简单题!
🧡《C语言入门100例》🧡

数据结构难?不存在的!
🌳《画解数据结构》🌳

LeetCode 太简单?算法学起来!
🌌《夜深人静写算法》🌌

一、题目

1、题目描述

  给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 #代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。
  样例输入: S = "ab#c", T = "ad#c"
  样例输出: true(两者都会变成 "ac"

2、基础框架

  • C语言 版本给出的基础框架代码如下:
bool backspaceCompare(char * s, char * t){
}

3、原题链接

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

二、解题报告

1、思路分析

  • 普通字符入栈,#出栈,注意判空操作;

  • 然后就是对于两个字符串,判断它们生成的栈是否相等了。

  • 对于字符串abc#d,最后得到的字符串为abd,如下图所示:

  • 两个栈判定相等,就是同时将两个栈进行 弹栈 操作,并且每次判定 栈顶 元素 是否相等,不相等直接返回 false。等其中一个栈为空,或者两个栈都为空,则结束循环。最后,如果两个栈都为空,则代表两个栈之前是相等的,否则不相等。

  • 有关 的实现,可以参见以下文章:《画解数据结构》栈

2、时间复杂度

  • 由于每个括号最多入栈一次,出栈一次。
  • 所以时间复杂度: O ( n ) O(n) O(n)

3、代码详解

/************************************* 栈的顺序表实现 *************************************/
#define DataType char
#define maxn 100010

struct Stack {
    DataType data[maxn];
    int top;
};

void StackClear(struct Stack* stk) {
    stk->top = 0;
}
void StackPushStack(struct Stack *stk, DataType dt) {
    stk->data[ stk->top++ ] = dt;
}
void StackPopStack(struct Stack* stk) {
    --stk->top;
}

DataType StackGetTop(struct Stack* stk) {
    return stk->data[ stk->top - 1 ];
}
int StackGetSize(struct Stack* stk) {
    return stk->top;
}
bool StackIsEmpty(struct Stack* stk) {
    return !StackGetSize(stk);
}
/************************************* 栈的顺序表实现 *************************************/

struct Stack stk1, stk2;

void getStackByString(char *s, struct Stack *stk) {
    int i = 0;
    StackClear(stk);
    while(s[i]) {
        if(s[i] == '#') {                  // (1)
            if(!StackIsEmpty(stk))
                StackPopStack(stk);
        }else {
            StackPushStack(stk, s[i]);     // (2)
        }
        ++i;
    }
}

bool backspaceCompare(char * s, char * t){
    getStackByString(s, &stk1);
    getStackByString(t, &stk2);
    while( !StackIsEmpty(&stk1) && !StackIsEmpty(&stk2) ) {   // (3)
        if( StackGetTop(&stk1) != StackGetTop(&stk2) ) {      // (4)
            return false;
        }
        StackPopStack(&stk1);
        StackPopStack(&stk2);
    }
    return (StackIsEmpty(&stk1) && StackIsEmpty(&stk2));      // (5)
}
  • ( 1 ) (1) (1) 遍历原字符串,遇到 '#'字符,代表退格,则直接出栈;
  • ( 2 ) (2) (2) 遇到其它字符,入栈;
  • ( 3 ) (3) (3) 两个里面只要有一个为空栈,则跳出循环;
  • ( 4 ) (4) (4) 栈顶元素不等,直接返回 失败;
  • ( 5 ) (5) (5) 保证两个栈都为空才是符合条件的。

三、本题小知识

   两个栈判定相等,就是同时将两个栈进行 弹栈 操作,并且每次判定 栈顶 元素 是否相等,不相等直接返回 false。等其中一个栈为空,或者两个栈都为空,则结束循环。最后,如果两个栈都为空,则代表两个栈之前是相等的,否则不相等。


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值