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++)相关推荐

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

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

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

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

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

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

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

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

  5. 日拱一卒——LeetCode 844.比较含退格的字符串

    大家好呀,今天为大家带来的LeetCode的题目是LeetCode 844.比较含退格的字符串.算是一道比较基础的题目. 题目 分析 这道题目相对简单,主要就是将时间复杂度和空间复杂度降低下来. 解法 ...

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

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

  7. 844. 比较含退格的字符串(双指针)

    844. 比较含退格的字符串 示例 1: 输入:s = "ab#c", t = "ad#c" 输出:true 解释:s 和 t 都会变成 "ac&qu ...

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

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

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

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

最新文章

  1. Linux网络服务-Web Service之【HTTP协议简介】(一)
  2. LINQ中的延迟查询特性
  3. hibernate 一对多、多对多的配置
  4. Android提示版本号更新操作流程
  5. Android MediaPlayer 和 NativePlayer 播放格式控制
  6. python时间格式化代码_Python代码中如何将”日期时间”格式化为自己所需的样式呢?...
  7. codeforces 675C C. Money Transfers(贪心)
  8. 使用Visual Studio SDK制作GLSL词法着色插件
  9. DirectX 基础总结笔记
  10. xui和嘟嘟桌面哪个好_小米这款手机桌面,好用到忘记原生桌面
  11. 无源贴片晶振四角引脚_贴片晶振引脚脚位地方向如何进行区分?
  12. 《Python基础教程》学习笔记——异常
  13. 最详细的【微信小程序+阿里云Web服务】开发部署指引(十一):开发小程序设置功能
  14. oracle忘记密码找回
  15. 部署web项目在腾讯云当中
  16. 感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k
  17. 设置mysql时间戳默认值(TIMESTAMP)
  18. 【Python高级编程】
  19. 北大核心2020_上清华也能选修北大课程?是的!清华北大互相开放部分本科课程...
  20. 用c语言实现简易三子棋

热门文章

  1. java for二重循环_java什么是二重循环
  2. web前端程序员求职时该如何写简历
  3. Go:测试库(GoConvey,testify,GoStub,GoMonkey)对比及简介
  4. android跌倒检测,基于Android手机的老人跌倒检测方法的研究与设计
  5. 苹果更新提示:已接入无线局域网却提示需要接入
  6. 关于Python的虚拟环境
  7. 西安电子科技大学计算机研究生工资,双一流高校本硕博毕业生,薪酬排名!西安电子科技大学全国第5!...
  8. java写文件用二进制分割_java分割二进制文件
  9. 2018/3/6-2018/3/10
  10. NOI 2005 聪聪可可