力扣 比较退格的字符串

题目描述

给定 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 只含有小写字母以及字符 ‘#’。

进阶:

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

解题思路

方法一: 重构字符串

将应该删除的字符和退格字符都删除掉, 还原原本的字符串,然后直接比较两个字符串是否相等即可

用栈处理遍历过程, 每次我们遍历到一个字符:

  • 如果它是退格符,那么我们将栈顶弹出;
  • 如果它是普通字符,那么我们将其压入栈中。

要注意的一点是如果栈为空栈且此时遍历到的字符为退格符, 因不做任何处理

class Solution {public:bool backspaceCompare(string S, string T) {return build(S)==build(T);}string build(string str){string ret;for(char ch:str){if(ch!='#'){ret.push_back(ch);}else if(!ret.empty())//注意考虑空栈时出现退格符这种情况{ret.pop_back();}}return ret;}
};

方法二:

利用两个指针分别逆向遍历字符串, 由于某个字符是否会被删掉只取决于该字符后面的退格符,而与该字符前面的退格符无关,因此当逆序遍历字符串时, 就可以立即确定当前字符时候会被删掉.

定义 skip 表示当前待删除的字符的数量。每次我们遍历到一个字符:

若该字符为退格符,则我们需要多删除一个普通字符,我们让skip 加 11;

若该字符为普通字符:

若skip==0,则说明当前字符不需要删去;

若 skip!=0,则说明当前字符需要删去,我们让skip 减 11。

这样,我们定义两个指针,分别指向两字符串的末尾。每次我们让两指针逆序地遍历两字符串,直到两字符串能够各自确定一个字符(此时该字符不是’#’, 且skip==0),然后将这两个字符进行比较。重复这一过程直到找到的两个字符不相等,或遍历完字符串为止。

class Solution {public:bool backspaceCompare(string S, string T) {int i = S.length() - 1, j = T.length() - 1;int skipS = 0, skipT = 0;while (i >= 0 || j >= 0) {while (i >= 0) {if (S[i] == '#') {skipS++, i--;} else if (skipS > 0) {skipS--, i--;} else {break;}}while (j >= 0) {if (T[j] == '#') {skipT++, j--;} else if (skipT > 0) {skipT--, j--;} else {break;}}if (i >= 0 && j >= 0) {if (S[i] != T[j]) {return false;}} else {if (i >= 0 || j >= 0) {return false;}}i--, j--;}return true;}
};

力扣 比较退格的字符串相关推荐

  1. byte数组转字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)...

    844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...

  2. 减去字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)

    844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...

  3. leetcode844 比较含退格的字符串(python)

    文章目录 844. 比较含退格的字符串 分析 代码(重构字符串(通过位置弹出)) 通过截图 代码(重构字符串(不断加入和弹出)) 通过截图 844. 比较含退格的字符串 给定 s 和 t 两个字符串, ...

  4. LeetCode第 844 题:比较含退格的字符串(C++)

    844. 比较含退格的字符串 - 力扣(LeetCode) 最终比较的是有效字符串是否相等,所以关键就是如何获取有效字符串. 一开始的思路,类似求字符串的最长子串的思路,利用左右边界的移动,但是写了写 ...

  5. 【LeetCode844.比较含退格的字符串】——双指针法

    目录: 844.比较含退格的字符串 思考: 利用栈: 双指针法: 844.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代 ...

  6. 每日一道leetcode(python)844. 比较含退格的字符串

    每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...

  7. 力扣刷题记录_字符串(自学)

    字符串 一.字符串 1.反转字符串(力扣344) 2.反转字符串 II(力扣541) 3.替换空格(剑指 Offer 05) 4.翻转字符串里的单词(力扣151) 5.左旋转字符串(剑指 Offer ...

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

    文章目录 844. 比较含退格的字符串 思路--双指针 844. 比较含退格的字符串 844. 比较含退格的字符串 思路–双指针 准备两个指针 endS, endT 分别指向 S,T 的末位字符,再准 ...

  9. leetcode系列-844.比较含退格的字符串

    leetcode系列–第844题.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代表退格字符.注意:如果对空文本输入退格字 ...

最新文章

  1. CSDN Blog V3.0 升级公告
  2. 通过js引入当前所需要的js,css等
  3. springmvc十六:视图解析
  4. linux下安装DB2的详细步骤
  5. redis核心与实战(一)数据结构篇
  6. mysql所以字段_MySQL|mysql-索引
  7. java 栈的用法_让Java程序员再次生机勃勃,还是技术的力量
  8. 这一周,我们迁移学习 | 内有福利
  9. Zabbix4.2监控nginx状态
  10. Tsung压力测试工具的搭建和使用,配置。
  11. 关于架设流媒体服务器与DRM加密问题
  12. 入门到 精通 JavaScript中的正则表达式RE、RegExp
  13. 360屏保壁纸android,“如何删除屏保和壁纸”的解决方案
  14. TCP常用网络和木马使用端口对照表,常用和不常用端口一览表
  15. 网络协议分析(某国外社交软件)
  16. android高级开发强化实战,高级Android开发强化实战[PDF][215.59MB]
  17. 服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。
  18. CodeForces - 855B - Marvolo Gaunt's Ring(线段树 or DP)
  19. 学习Vue3 第二十六章(深入v-model)
  20. 小型水库雨水情测报和大坝安全监测

热门文章

  1. Linux之cut命令
  2. elasticsearch-analysis-ik-1.10.0中文分词插件安装
  3. 中无法打开源文件_Safari浏览器无法打开,如何解决Safari在Big Sur中崩溃的情况...
  4. layui表格有边框_layui前端框架表格如何进行屏幕适配
  5. 现代操作系统原理与实践02:硬件结构
  6. gitlab 安装_安装Gitlab-注意端口
  7. Linux(2) vi和vim编辑器
  8. webbrowser控件 加载为空白_OA系统公文控件升级操作说明
  9. [转帖]备忘:CentOS-7 使用systemctl 管理的服务,文件打开数上限1024要改
  10. 函数的练习1——python编程从入门到实践