首页 > 其他分享 >比较含退格的字符串---双指针

比较含退格的字符串---双指针

时间:2023-03-01 20:12:22浏览次数:46  
标签:cnt1 -- --- while cnt2 && 退格 指针

比较含退格的字符串

给定 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)
链接:https://leetcode.cn/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:双指针

从前面开始比较的话,当前的字符并不确定会不会被删除掉,所以可以从后面开始遍历比较。如果是退格键的话就不断退格,直到遇到字符,再比较即可。但是模拟退格的过程犯了挺多错误试错了很久,最后的代码也不够优雅。还是要想清楚伪代码有大致确定的思路再动手吧2333.挖个坑,后面看一下别人怎么写的。

code

class Solution {
public:

    //从后向前比较是否相等而不是从前向后
    //遇到空格键向前退格,直到两个都是字母为止
    bool backspaceCompare(string s, string t) {
        
        int i = s.size() -1,j = t.size() -1;
        
        //记录退格键数目
        int cnt1 = 0,cnt2 = 0;

        while(i >= 0 && j >= 0)
        {
            //不断退格直到出现字母为止
            //模拟退格的过程直到两个都指向字母或者为空
            //关键:如何模拟退格的过程,脑袋混乱了这么简单的过程愣是没有想清楚
            //模拟退格过程并且最后遇到的是字母or越界
            
            while(i >= 0 && s[i] == '#')
            {
                //从当前的退格键往前退格直到退格完成
                cnt1 = 1;
                i --;
                while(cnt1 > 0)
                {
                    if(i >= 0 && s[i] == '#') cnt1 ++,i--;
                    else cnt1 --,i--;
                }
            }

            while(j >= 0 && t[j] == '#')
            {
                //从当前位置开始退格
                cnt2 = 1;
                j --;
                while(cnt2 > 0)
                {
                    if(j >= 0 && t[j] == '#') cnt2 ++,j--;
                    else cnt2 --,j --;
                }
            }
            if(i >= 0 && j >= 0 && s[i] == t[j])
            {
                i--,j--;
            }
            else if(i >= 0 && j >= 0 && s[i] != t[j])
            {
                return false;
            }
           
        }

        //最后可能长的一部分是空的因此我们还要收尾处理一下
        //"nzp#o#g"
        //"b#nzp#o#g"
        
        while(i >= 0 && s[i] == '#')
            {
                //从当前的退格键往前退格直到退格完成
                cnt1 = 1;
                i --;
                while(cnt1 > 0)
                {
                    if(i >= 0 && s[i] == '#') cnt1 ++,i--;
                    else cnt1 --,i--;
                }
            }

            while(j >= 0 && t[j] == '#')
            {
                //从当前位置开始退格
                cnt2 = 1;
                j --;
                while(cnt2 > 0)
                {
                    if(j >= 0 && t[j] == '#') cnt2 ++,j--;
                    else cnt2 --,j --;
                }
            }

        if(i < 0 && j < 0) return true;
        else return false;

    }
};

标签:cnt1,--,---,while,cnt2,&&,退格,指针
From: https://www.cnblogs.com/huangxk23/p/17169520.html

相关文章

  • 记录--虚拟滚动探索与封装
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1.介绍什么是虚拟滚动?虚拟滚动就是通过js控制大列表中的dom创建与销毁,只创建可视区域dom,非可视区域的d......
  • (数据库系统概论|王珊)第七章数据库设计-第四节:逻辑结构设计
    pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解目录一:E-R图向关系模式的转换(1)转换原则(2)具体转换......
  • Linux-iptables
    iptables一、概述iptables主要为了封端口,封ip,实现NAT功能(共享上网,端口映射,ip映射)二、防火墙种类及使用说明硬件:整个企业的入口三层路由:H3C,华为,Cisco(思科)防火墙......
  • Linux-shell编程(一)
    shell编程(一)一、概述shell命令解释器:bash编程命令解释器bash目前应用最广泛一款命令解释器,红帽系列(默认),Debian,Ubuntu,BASH全称:Bourne-AgainSHelld......
  • Linux-shell编程(二)
    shell编程(二)一、运算1.运算符运算符含义+加-减*乘/除%取余^或**幂、指数i=i+1i++计算次数j=j+j+=求和,累加&&并且,前一个......
  • Linux-shell编程(三)
    shell编程(三)一、循环1.循环概述循环类型格式说明for循环for变量in清单(列表);do命令;donefor((i=1;i<=10;i++));doecho$i;done最常用的循环w......
  • 数组遇上指针
    //一个8位的空间,如果表示无符号数0-255unsignedchar0~2^8-1//如果用来表示有符号数-128~127char-2^7~2^7-1//对其范围的探求,不止于,自字节数#i......
  • 记录一个cpu彪高的BUG处理--jvm调优
    业务场景:游戏行业,N个服务器,要进行大批量的合服处理,玩家数据会上升,从新整理和服务器的分配情况和逻辑处理,正常开发后,当天白天正常,然后晚上高峰期开始玩家频繁反馈无法登录~~......
  • 数据密集型应用-数据复制
    https://blog.csdn.net/m0_53157173/article/details/128061594https://blog.51cto.com/feishujun/5522225单节点单节点模式存在的问题:并发量太小,大量读写请求打在同......
  • C/C++职工工作量统计系统[2023-03-01]
    C/C++职工工作量统计系统[2023-03-01]题目17:职工工作量统计系统设计编写一个程序,该程序能输入职工工号、完成的产品数量、产品名称、产品种类,程序允许同一职工有多次输......