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

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《栈》简单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。等其中一个栈为空,或者两个栈都为空,则结束循环。最后,如果两个栈都为空,则代表两个栈之前是相等的,否则不相等。


以上是关于⭐算法入门⭐《栈》简单03 —— LeetCode 844. 比较含退格的字符串的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《栈 和 队列》简单01 —— LeetCode 232. 用栈实现队列

⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈

⭐算法入门⭐《栈 和 队列》简单02 —— LeetCode 225. 用队列实现栈

⭐算法入门⭐《栈》简单04 —— LeetCode 682. 棒球比赛

⭐算法入门⭐《栈》简单01 —— LeetCode 20. 有效的括号

⭐算法入门⭐《栈》简单02 —— LeetCode 234. 回文链表