LeetCode第 844 题:比较含退格的字符串(C++)
844. 比较含退格的字符串 - 力扣(LeetCode)
最终比较的是有效字符串是否相等,所以关键就是如何获取有效字符串。
一开始的思路,类似求字符串的最长子串的思路,利用左右边界的移动,但是写了写觉得不完善,这题是在看栈的时候过来的,所想到了用栈,思路比较明确了:
class Solution {
public:stack<int> f(string &s){stack<int> stk;for(const auto &c : s){if(c != '#')stk.push(c);else if(!stk.empty())stk.pop();}return stk;}bool backspaceCompare(string S, string T) {auto stk1 = f(S); auto stk2 = f(T);if(stk1.size() != stk2.size())return false;while(!stk1.empty()){if(stk1.top() != stk2.top())return false;stk1.pop();stk2.pop();}return true;}
};
不用栈保存有效字符串也是可以的:
class Solution {
public:string f(string &s){string l_tmp;// 用于记录字母个数int count = 0;for(const auto &c : s){if(c != '#'){l_tmp += c;++count;}else if(count != 0){l_tmp.erase(l_tmp.end() - 1);--count;}}return l_tmp;}bool backspaceCompare(string S, string T) {return f(S) == f(T);}
};
不过这个思路时间空间复杂度不难分析均为O(M+N),M,N为两字符串长度,没法达到进阶要求的空间复杂度O(1)。空间复杂度要为O(1),必然就不能先保存有效字符串再进行比较了,只能在遍历的时候进行比较,可是仔细一想遍历的时候没法进行比较啊:因为你没法确认当前字符是不是有效的,万一后面有退格符呢?
官方题解思路:
那方法就只有一个了,逆序遍历,可以实现遍历到某字符的时候对其是否有效进行判别,因为逆序的话是可以记录当前字符后面的退格符个数的:
(这个代码还是不太好理解的,建议单步走一遍)
class Solution {
public:bool backspaceCompare(string S, string T) {// 用于记录退格个数int s_num = 0, t_num = 0;// 下标或者迭代器逆序遍历,m,n代表下标int m = S.size() - 1, n = T.size() - 1;while(m >= 0 || n >= 0){while(m >= 0){if(S[m] == '#'){++s_num; --m;}else if(s_num > 0){--s_num; --m;}else break; //如果最后一个是字母,就会直接break}while(n >= 0){if(T[n] == '#'){++t_num; --n;}else if(t_num > 0){--t_num; --n;}else break; //如果最后一个是字母,就会直接break}// 比较“最后”一个字母是否相等// 注意下标合法性检查if(m >= 0 && n >= 0 && S[m] != T[n]) return false;if((m >= 0) != (n >= 0)) return false;--m; --n;}return true;}
};
LeetCode第 844 题:比较含退格的字符串(C++)相关推荐
- leetcode系列-844.比较含退格的字符串
leetcode系列–第844题.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代表退格字符.注意:如果对空文本输入退格字 ...
- byte数组转字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)...
844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...
- 减去字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)
844. 比较含退格的字符串 难度:简单 第一:简单浏览一下题目 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果.# 代表退格字符. 注意:如果对空文 ...
- 每日一道leetcode(python)844. 比较含退格的字符串
每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...
- 日拱一卒——LeetCode 844.比较含退格的字符串
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 844.比较含退格的字符串.算是一道比较基础的题目. 题目 分析 这道题目相对简单,主要就是将时间复杂度和空间复杂度降低下来. 解法 ...
- 844. 比较含退格的字符串
文章目录 844. 比较含退格的字符串 思路--双指针 844. 比较含退格的字符串 844. 比较含退格的字符串 思路–双指针 准备两个指针 endS, endT 分别指向 S,T 的末位字符,再准 ...
- 844. 比较含退格的字符串(双指针)
844. 比较含退格的字符串 示例 1: 输入:s = "ab#c", t = "ad#c" 输出:true 解释:s 和 t 都会变成 "ac&qu ...
- leetcode844 比较含退格的字符串(python)
文章目录 844. 比较含退格的字符串 分析 代码(重构字符串(通过位置弹出)) 通过截图 代码(重构字符串(不断加入和弹出)) 通过截图 844. 比较含退格的字符串 给定 s 和 t 两个字符串, ...
- 【LeetCode844.比较含退格的字符串】——双指针法
目录: 844.比较含退格的字符串 思考: 利用栈: 双指针法: 844.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true .# 代 ...
最新文章
- Linux网络服务-Web Service之【HTTP协议简介】(一)
- LINQ中的延迟查询特性
- hibernate 一对多、多对多的配置
- Android提示版本号更新操作流程
- Android MediaPlayer 和 NativePlayer 播放格式控制
- python时间格式化代码_Python代码中如何将”日期时间”格式化为自己所需的样式呢?...
- codeforces 675C C. Money Transfers(贪心)
- 使用Visual Studio SDK制作GLSL词法着色插件
- DirectX 基础总结笔记
- xui和嘟嘟桌面哪个好_小米这款手机桌面,好用到忘记原生桌面
- 无源贴片晶振四角引脚_贴片晶振引脚脚位地方向如何进行区分?
- 《Python基础教程》学习笔记——异常
- 最详细的【微信小程序+阿里云Web服务】开发部署指引(十一):开发小程序设置功能
- oracle忘记密码找回
- 部署web项目在腾讯云当中
- 感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k
- 设置mysql时间戳默认值(TIMESTAMP)
- 【Python高级编程】
- 北大核心2020_上清华也能选修北大课程?是的!清华北大互相开放部分本科课程...
- 用c语言实现简易三子棋
热门文章
- java for二重循环_java什么是二重循环
- web前端程序员求职时该如何写简历
- Go:测试库(GoConvey,testify,GoStub,GoMonkey)对比及简介
- android跌倒检测,基于Android手机的老人跌倒检测方法的研究与设计
- 苹果更新提示:已接入无线局域网却提示需要接入
- 关于Python的虚拟环境
- 西安电子科技大学计算机研究生工资,双一流高校本硕博毕业生,薪酬排名!西安电子科技大学全国第5!...
- java写文件用二进制分割_java分割二进制文件
- 2018/3/6-2018/3/10
- NOI 2005 聪聪可可