⭐算法入门⭐《栈》简单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、原题链接
二、解题报告
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. 棒球比赛