【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
更多 LeetCode 题解笔记可以访问我的 github。
描述
给定 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”。
提示:
1 <= S.length <= 200
1 <= T.length <= 200
S
和T
只含有小写字母以及字符'#'
。
解法一:字符串比较
思路
当拿到这道题时,可能最直接的想法就是将两个字符串所对应的结果进行比较。为了能够得到字符串所对应的结果,需要借助栈来模拟键入的过程。从左往右遍历字符串,如果当前的字符并不是退格字符 #
,那么就将当前的字符压入栈中;如果当前的字符是退格字符且栈不为空,那么就将栈顶的元素弹出。最后,栈中剩余字符所组成的字符串即为所求。
Java 实现
class Solution {
public boolean backspaceCompare(String S, String T) {
return build(S).compare(build(T));
}
private String build(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c != '#') {
stack.push(c);
} else if (!stack.isEmpty()) {
stack.pop();
}
}
return String.valueOf(stack);
}
}
Python 实现
class Solution:
def backspaceCompare(self, S, T):
"""
:type S: str
:type T: str
:rtype: bool
"""
def build(s):
stack = []
for c in s:
if c != '#':
stack.append(c)
elif stack:
stack.pop()
return ''.join(stack)
return build(S) == build(T)
复杂度分析
- 时间复杂度:\(O(m + n)\),其中 \(m\) 和 \(n\) 分别表示字符串
S
和T
的长度。 - 空间复杂度:\(O(m + n)\)
解法二:双指针(推荐)
思路
第二种解法本质上也是对字符串所对应的结果进行比较,只不过与解法一不同的是,解法二是逐个字符进行比较,当发现有字符不相等时,返回 false
。为了能对两个字符串所对应的结果进行比较,需要两个指针,用于指向比较的字符。与此同时,当遇到退格符 #
时,跳过下一个非退格符的符号,取下下个字符进行比较。为了能够更加生动地说明这个过程,采用了示例1的两个字符作为函数的输入(S="ab#c"
、T="ad#c"
),用于演示整个过程,具体的过程见下面的一系列图片。
- 初始时,
i=3
、j=3
,此时由于两个索引所对应的字符并不是退格符,直接进行比较(结果相等,i
和j
都减一进入下一次循环)
- 当
i=2
、j=2
时,此时两个索引所对应的字符都是退格符,因此跳过下一个非退格符的字符(字符串S
中是字符b
,而字符串T
中是字符d
)
- 当
i=0
、j=0
时,此时两个索引所对应的字符都不是退格符,再一次进行比较,结果相等,至此循环结束,最终函数返回结果为true
Java 实现
class Solution {
public boolean backspaceCompare(String S, String T) {
int i = S.length() - 1, j = T.length() - 1;
int sSkip = 0, tSkip = 0;
while (i >= 0 || j >= 0) {
// 找到字符串S所对应的结果的下一个字符
while (i >= 0) {
if (S.charAt(i) == '#') {
--i;
++sSkip;
} else if (sSkip > 0) {
--i;
--sSkip;
} else {
break;
}
}
// 找到字符串T所对应的结果的下一个字符
while (j >= 0) {
if (T.charAt(j) == '#') {
--j;
++tSkip;
} else if (tSkip > 0) {
--j;
--tSkip;
} else {
break;
}
}
// 如果索引i和j所对应的字符不相等,返回false
if (i >= 0 && j >= 0 && S.charAt(i) != T.charAt(j)) {
return false;
}
// 如果遍历完一个字符串的同时,另一个字符串还未遍历完,返回false
if ((i >= 0) != (j >= 0)) {
return false;
}
--i;
--j;
}
return true;
}
}
Python 实现
class Solution:
def backspaceCompare(self, S, T):
"""
:type S: str
:type T: str
:rtype: bool
"""
i, j, s_skip, t_skip = len(S) - 1, len(T) - 1, 0, 0
while i >= 0 or j >= 0:
# 找到字符串S所对应结果的下一个字符
while i >= 0:
if S[i] == '#':
i -= 1
s_skip += 1
elif s_skip > 0:
i -= 1
s_skip -= 1
else:
break
# 找到字符串T所对应结果的下一个字符
while j >= 0:
if T[j] == '#':
j -= 1
t_skip += 1
elif t_skip > 0:
j -= 1
t_skip -= 1
else:
break
# 如果索引i和j所对应的字符不相等,返回False
if i >= 0 and j >= 0 and S[i] != T[j]:
return False
# 如果遍历完一个字符的同时,另一个字符还未遍历完,返回False
if (i >= 0) != (j >= 0):
return False
return True
# Time Limit Exceeded
复杂度分析
- 时间复杂度:\(O(m + n)\),其中 \(m\) 和 \(n\) 分别表示字符串
S
和T
的长度。 - 空间复杂度:\(O(1)\)
【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)的更多相关文章
- [Swift]LeetCode844. 比较含退格的字符串 | Backspace String Compare
Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...
- C#LeetCode刷题之#844-比较含退格的字符串(Backspace String Compare)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...
- LeetCode--844--比较含退格的字符串(java)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- leetcode-844-比较含退格的字符串(用vector取代stack)
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...
- Q844 比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- Leetcode844.Backspace String Compare比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- LeetCode844 比较含退格的字符串
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...
- LeetCode:比较含退格字符串【844】
LeetCode:比较含退格字符串[844] 题目描述 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = ...
- HBase的shell命令行界面按退格键(Backspace)无法删除问题
在HBase的shell命令行界面输入错误项按"退格键"删除,却怎么也删除不了: 解决办法: 第一步,修改SecureCRT的设置参数: 第二步,按"Ctrl+退格键(B ...
随机推荐
- ES基本操作
倒排索引 ElasticSearch使用一种称为倒排索引的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表. 查询 # 查看索引配置GE ...
- oc门
OC门电路,即集电极开路输出结构门电路,电路结构图为:
- nginx 执行理解
nginx是一个代理(apache)或者自己处理 location ~ \.php { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock ...
- 附加题:将四则运算源代码上传到Github账户上
1.创建仓库用于存储管理本地文件 2.远程添加github上的Blog仓库. 3.获取github中Blog仓库的地址. 4.在Add Remote窗口中填写名字.Location. 5.将本地文件通 ...
- [转载]金融行业 DevOps 解决方案概述
2009 年 6 月份,John Allspaw 及 Paul Hammond 在速度大会 (Velocity) 上分享了在 Flickr 中如何通过加强 Dev(开发团队)和 Ops(运维团队)之间 ...
- 通过修改EIP寄存器实现远程注入
功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分) 原理: 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝 ...
- cad.net的undo返回操作
这是提供给许多从lisp转移到c#的开发人员的一个函数,这个函数利用后绑代码实现undo返回操作. 本代码由edata提供: edata博客 /// <summary> /// 命令动作编 ...
- 07-01 Java 封装
1:成员变量和局部变量的区别 /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量 ...
- [Umbraco] 开篇
本人虽已不做网站好几年,但这一技能至今也未能抛弃.如今要让我去做一个企业级产品介绍网站,我会很头疼,很痛苦,想的简单或想的复杂都是一件不讨好的事情. 任何这类网站都想快速开发,不管是节约时间,节约成本 ...
- 集合框架_DAY17
1:五种数据结构: 数组:长度固定,有序,查找方便 链表:添加删除方便 栈:先进后出 队列:先进先出 树结构:完成排序动作 2:泛型(了解) (1)是一种把明确数据类型的工作推迟到创 ...