力扣 比较退格的字符串
力扣 比较退格的字符串
题目描述
给定 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;}
};
力扣 比较退格的字符串相关推荐
- byte数组转字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)...
844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...
- 减去字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)
844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...
- leetcode844 比较含退格的字符串(python)
文章目录 844. 比较含退格的字符串 分析 代码(重构字符串(通过位置弹出)) 通过截图 代码(重构字符串(不断加入和弹出)) 通过截图 844. 比较含退格的字符串 给定 s 和 t 两个字符串, ...
- LeetCode第 844 题:比较含退格的字符串(C++)
844. 比较含退格的字符串 - 力扣(LeetCode) 最终比较的是有效字符串是否相等,所以关键就是如何获取有效字符串. 一开始的思路,类似求字符串的最长子串的思路,利用左右边界的移动,但是写了写 ...
- 【LeetCode844.比较含退格的字符串】——双指针法
目录: 844.比较含退格的字符串 思考: 利用栈: 双指针法: 844.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代 ...
- 每日一道leetcode(python)844. 比较含退格的字符串
每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...
- 力扣刷题记录_字符串(自学)
字符串 一.字符串 1.反转字符串(力扣344) 2.反转字符串 II(力扣541) 3.替换空格(剑指 Offer 05) 4.翻转字符串里的单词(力扣151) 5.左旋转字符串(剑指 Offer ...
- 844. 比较含退格的字符串
文章目录 844. 比较含退格的字符串 思路--双指针 844. 比较含退格的字符串 844. 比较含退格的字符串 思路–双指针 准备两个指针 endS, endT 分别指向 S,T 的末位字符,再准 ...
- leetcode系列-844.比较含退格的字符串
leetcode系列–第844题.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代表退格字符.注意:如果对空文本输入退格字 ...
最新文章
- CSDN Blog V3.0 升级公告
- 通过js引入当前所需要的js,css等
- springmvc十六:视图解析
- linux下安装DB2的详细步骤
- redis核心与实战(一)数据结构篇
- mysql所以字段_MySQL|mysql-索引
- java 栈的用法_让Java程序员再次生机勃勃,还是技术的力量
- 这一周,我们迁移学习 | 内有福利
- Zabbix4.2监控nginx状态
- Tsung压力测试工具的搭建和使用,配置。
- 关于架设流媒体服务器与DRM加密问题
- 入门到 精通 JavaScript中的正则表达式RE、RegExp
- 360屏保壁纸android,“如何删除屏保和壁纸”的解决方案
- TCP常用网络和木马使用端口对照表,常用和不常用端口一览表
- 网络协议分析(某国外社交软件)
- android高级开发强化实战,高级Android开发强化实战[PDF][215.59MB]
- 服务器错误500-内部服务器错误。您查找的资源存在问题,因而无法显示。
- CodeForces - 855B - Marvolo Gaunt's Ring(线段树 or DP)
- 学习Vue3 第二十六章(深入v-model)
- 小型水库雨水情测报和大坝安全监测
热门文章
- Linux之cut命令
- elasticsearch-analysis-ik-1.10.0中文分词插件安装
- 中无法打开源文件_Safari浏览器无法打开,如何解决Safari在Big Sur中崩溃的情况...
- layui表格有边框_layui前端框架表格如何进行屏幕适配
- 现代操作系统原理与实践02:硬件结构
- gitlab 安装_安装Gitlab-注意端口
- Linux(2) vi和vim编辑器
- webbrowser控件 加载为空白_OA系统公文控件升级操作说明
- [转帖]备忘:CentOS-7 使用systemctl 管理的服务,文件打开数上限1024要改
- 函数的练习1——python编程从入门到实践