题目:

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 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 = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

1 <= s.length, t.length <= 200
s 和 t 只含有小写字母以及字符 '#'

进阶:

你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:使用栈的思路

  • 当 当前字符不为 ‘#’时,将其弹入字符栈中;
  • 当当前字符为‘#’ 且字符栈不为空时,弹出字符栈的最后一个字符;
  • 最后将两个字符栈中的字符进行比较即可。

可以通过,但是复杂度不满足进阶题意

  • 时间复杂度:O(n + m)
  • 空间复杂度:O(n + m)
 1 class Solution {
2 public boolean backspaceCompare(String s, String t) {
3 return getString(s).equals(getString(t));
4
5 }
6 public String getString(String s){
7 StringBuilder sb = new StringBuilder();
8 for (char c : s.toCharArray()){
9 if (c != '#'){
10 sb.append(c);
11 }else if (sb.length() > 0){
12 sb.deleteCharAt(sb.length() - 1);
13 }
14 }
15 return sb.toString();
16 }
17 }

方法二:双指针

两个指针i ,j 分别指向字符串s和t 的末尾,countT和countS来统计s 和t 中的 #的数量,从后往前遍历字符串处理过程如下:

  • 若当前字符为 # ,则Count值加1;
  • 若当前字符不为#且count值不为0,就该处理退格,count值就会减1,字符位置也会减1;
  • 以上两种情况的否定即当前字符不为#且count值为0,代表当前字符不会背回退,则用来和另一个字符串中的当前位置做比较;

若对比过程出现S和T 当前字符不匹配,则遍历结束,返回 false,若S,T 都遍历结束,且都能一一匹配,则返回true。

复杂度:

  • 时间复杂度:O(n + m)
  • 空间复杂度:O(1)

代码:

 1 class Solution {
2 public boolean backspaceCompare(String s, String t) {
3 int i = s.length() - 1, j = t.length() - 1;
4 //统计字符串中#数量
5 int countS = 0, countT = 0;
6 while (i >= 0 || j >= 0){
7 //处理s
8 while (i >= 0){
9 if (s.charAt(i) == '#'){
10 countS++;
11 i--;
12 }else if (countS > 0){
13 //这时候就该抵消字符了
14 countS--;
15 i--;
16 }else{
17 break;
18 }
19 }
20 //处理t
21 while (j >= 0){
22 if (t.charAt(j) == '#'){
23 countT++;
24 j--;
25 }else if (countT > 0){
26 //这时候就该抵消字符了
27 countT--;
28 j--;
29 }else{
30 break;
31 }
32 }
33 //两个小循环处理完毕以后,进入大循环判断
34 if (i >= 0 && j >= 0){
35 if (s.charAt(i) != t.charAt(j)){
36 return false;
37 }
38 }else if (i >= 0 || j >= 0){
39 // i>=0 且 j >= 0为false的情况
40 // i < 0 且 j >= 0 :
41 // i >= 0 且 j < 0 :
42 //以上两种不满足,其中有一个在还没有遍历完的时候就找到字符,另一个已经遍历完了不符合题意
43 // i < 0 且 j < 0:在0位置找到了#,回退就变成了空字符,符合题意
44 return false;
45 }
46 i--;
47 j--;
48 }
49 return true;
50 }
51 }

2023-05-19:二刷还是写不出来

 1 class Solution {
2 public boolean backspaceCompare(String s, String t) {
3 char[] ch1 = s.toCharArray();
4 char[] ch2 = t.toCharArray();
5 return getString(ch1).equals(getString(ch2));
6 }
7 public String getString(char[] ch){
8 int slow = 0;
9 for (int fast = 0; fast < ch.length; fast++){
10 if (ch[fast] != '#') {
11 ch[slow] = ch[fast];
12 slow++;
13 }else {
14 if (slow > 0) slow--;
15 }
16 }
17 return new String(ch).substring(0, slow);
18 }
19 }

力扣844(Java)-比较含退格的字符串(简单)的更多相关文章

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

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

  2. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

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

  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. C#LeetCode刷题之#844-比较含退格的字符串​​​​​​​(Backspace String Compare)

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

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

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

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

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

  10. [LeetCode] 844. Backspace String Compare 退格字符串比较

    Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...

随机推荐

  1. 什么是k8s中的sidecar模式

    在Kubernetes中,Sidecar模式是一种将辅助容器与主应用程序容器一起部署在同一个Pod中的设计模式.这种模式的目的是将辅助功能与主应用程序解耦,并提供独立发布.能力重用以及共享资源和网络的 ...

  2. Python使用os模块创建带时间戳的文件夹

    直接上源码: # 导入os模块 import os import time # 创建文件夹函数 def mkdir(path): # os.path.exists 函数判断文件夹是否存在 folder ...

  3. day06-SpringMVC底层机制简单实现-02

    SpringMVC底层机制简单实现-02 https://github.com/liyuelian/springmvc-demo.git 4.任务3-从web.xml动态获取容器配置文件 4.1分析 ...

  4. 毕设系列之Linux V4L2(图形图像采集篇)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  5. UE像素流送是什么?像素流推流原理介绍

    游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用,多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑,但每个单独的实例仍然会为自己的玩家在本地渲染游戏.即使是使 ...

  6. WPF多数类概念性注册加自动扫描

    在java中springboot的配置应用了自动扫描 @ComponentScan(value = {"com.example", "com.fox"}) 而对 ...

  7. 记录--实现一个鼠标框选的功能,要怎么实现和设计 api?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前两年在一家做电商的公司做了一个需求:鼠标框选商品卡片,开始拖拽的时候合成一个然后改变位置,页面上有几千个所以还要结合虚拟列表.当时 ...

  8. MYSQL 同步到ES 如何设计架构保持一致性

    简单使用某个组件很容易,但是一旦要搬到生产上就要考虑各种各样的异常,保证你方案的可靠性,可恢复性就是我们需要思考的问题.今天来聊聊我们部门在 MYSQL 同步到ES的方案设计. 在面对复杂条件查询时, ...

  9. 立创EDA的使用

    立创EDA的使用 1.实验原理 最近在使用立创EDA来做电路作业,这里记录一下立创EDA的基本操作,以后小型的电路设计可以在其主页完成.立创EDA是一个可以线上完成电路设计仿真以及布线的免费设计工具, ...

  10. 采用DevOps的7个主要障碍,你一定不知道!

    尽管DevOps已经相对成熟,DevOps哲学仍然在回避甚至是最著名和最有资源的组织.一份令人震惊的Gartner报告显示,75%的DevOps项目未能实现其目标.为什么DevOps的失败率如此之高? ...