更多 LeetCode 题解笔记可以访问我的 github

描述

给定 ST 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

示例 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. 1 <= S.length <= 200
  2. 1 <= T.length <= 200
  3. ST 只含有小写字母以及字符 '#'

解法一:字符串比较

思路

当拿到这道题时,可能最直接的想法就是将两个字符串所对应的结果进行比较。为了能够得到字符串所对应的结果,需要借助栈来模拟键入的过程。从左往右遍历字符串,如果当前的字符并不是退格字符 #,那么就将当前的字符压入栈中;如果当前的字符是退格字符且栈不为空,那么就将栈顶的元素弹出。最后,栈中剩余字符所组成的字符串即为所求。

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\) 分别表示字符串 ST 的长度。
  • 空间复杂度:\(O(m + n)\)

解法二:双指针(推荐)

思路

第二种解法本质上也是对字符串所对应的结果进行比较,只不过与解法一不同的是,解法二是逐个字符进行比较,当发现有字符不相等时,返回 false。为了能对两个字符串所对应的结果进行比较,需要两个指针,用于指向比较的字符。与此同时,当遇到退格符 # 时,跳过下一个非退格符的符号,取下下个字符进行比较。为了能够更加生动地说明这个过程,采用了示例1的两个字符作为函数的输入(S="ab#c"T="ad#c"),用于演示整个过程,具体的过程见下面的一系列图片。

  • 初始时, i=3j=3,此时由于两个索引所对应的字符并不是退格符,直接进行比较(结果相等,ij 都减一进入下一次循环)

  • i=2j=2 时,此时两个索引所对应的字符都是退格符,因此跳过下一个非退格符的字符(字符串 S 中是字符 b,而字符串 T 中是字符 d

  • i=0j=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\) 分别表示字符串 ST 的长度。
  • 空间复杂度:\(O(1)\)

【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)的更多相关文章

  1. [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 ...

  2. C#LeetCode刷题之#844-比较含退格的字符串​​​​​​​(Backspace String Compare)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...

  3. LeetCode--844--比较含退格的字符串(java)

    给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...

  4. leetcode-844-比较含退格的字符串(用vector取代stack)

    题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...

  5. Q844 比较含退格的字符串

    给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...

  6. Leetcode844.Backspace String Compare比较含退格的字符串

    给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...

  7. LeetCode844 比较含退格的字符串

    题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...

  8. LeetCode:比较含退格字符串【844】

    LeetCode:比较含退格字符串[844] 题目描述 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = ...

  9. HBase的shell命令行界面按退格键(Backspace)无法删除问题

    在HBase的shell命令行界面输入错误项按"退格键"删除,却怎么也删除不了: 解决办法: 第一步,修改SecureCRT的设置参数: 第二步,按"Ctrl+退格键(B ...

随机推荐

  1. NoSQL世界的几个重要理论

    和所有事物一样,NoSQL的兴起也是由许多理论支撑作为前提的,正是由下面一些理论的支撑,NoSQL的方向才能如此明朗. 1.CAP理论 CAP理论无疑是导致技术趋势由关系数据库系统向NoSQL系统转变 ...

  2. debian7(wheezy)升级安装mercurial hg最新版2.8-RC,解决tortoisehg2.9.2不能使用。

    debian&(wheezy)之前的仓库版本是2.2.2.  注: 本文以 # 为开始的行是工作在root下的模式,在终端显示为root的提示符# ,用户目录的($:)需要切换到root(使用 ...

  3. 中美会计准则差异比较(PRC GAAP VS US GAAP)

    http://bbs.chinaacc.com/forum-2-43/topic-2023118.html 一.中美会计准则的实质性差别    rule based vs principle base ...

  4. pycharm的基本使用

    1.设置注释字体的颜色,如下图 2.常用快捷键 Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 类名完成 Ctrl + Shift + Enter 语 ...

  5. CentOS使用vsftpd开启FTP服务以及配置用户

    1.安装服务 #yum install vsftpd 2.配置 #vi /etc/vsftpd/vsftpd.conf # 禁止匿名访问 anonymous_enable=NO # 允许本地用户登录F ...

  6. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  7. 【BZOJ5306】 [Haoi2018]染色

    BZOJ5306 [Haoi2018]染色 Solution xzz的博客 代码实现 #include<stdio.h> #include<stdlib.h> #include ...

  8. ubuntu 环境 openstack 源码包制成 deb 包

    安装软件: sudo apt-get install dh-make checkinstall cd neutron sudo checkinstall -D -y -install=no -pkgv ...

  9. Linux常用命令 - ls

    目录 Linux常用命令-ls 简介 ls -F ls -a ls -R ls -l 后记 Linux常用命令-ls 简介 ls主要用于显示文件和目录列表.作为最常见的Linux命令,大家应该都不会陌 ...

  10. " XSS易容术---bypass之编码混淆篇+辅助脚本编写"

    一.前言本文原创作者:vk,本文属i春秋原创奖励计划,未经许可禁止转载!很多人对于XSS的了解不深.一提起来就是:“哦,弹窗的”.”哦,偷cookie的.”骚年,你根本不知道什么是力量.虽然我也不知道 ...